您的位置:首页 > 运维架构 > Tomcat

Tomcat 应用 (二)

2017-11-20 08:38 134 查看

前言

Tomcat 作为整个网站架构中一个重要的组成部分,能够解析并运行嵌套在 HTML 中的 Java 代码,其重要程度是毋庸置疑的。而 Tomcat 中的组件也是非常的多,其中一些重要组件如下:

服务器(Server):Tomcat 的一个实例,也就是说一个 Server 就是一个 Tomcat 。

引擎(Engine):真正能够处理请求的 Tomcat 的核心组件。

连接器(Connectors):能够将客户端发送过来的请求转交给后端能够真正处理该请求的组件(Engine)。

服务(Service):连接器(Connectors)不能够单独连接引擎(Engine),而是必须通过服务(Service)这个组件进行关联。

当然还有其他的组件,这里就不一一说明了,如果想了解更多请看我上一篇博客:Tomcat 基础配置及原理

Tomcat 组件应用

[b]1、服务器(Server)组件[/b]



Server 组件,Tomcat 的实例,默认监听端口
8005
。在启动过程中,这个端口是最后启动的,如果这个端口没有启动,我们会发现访问不了。用户可以通过
Telnet
命令连接上 Tomcat 之后使用
SHUTDOWN
这个命令直接停止 Tomcat。所以这是一个需要很小心的地方,不过你可以对这个命令进行修改

Listener 这个组件顾名思义就是一个监听者,它能够监听 Tomcat 的启动与停止,监听 Tomcat 中文件的修改与增加,监听虚拟机的变化等。

GlobalNaminResources 这个组件是 Tomcat 的一个资源管理器。

对于 Server 这个组件来说,默认即可,最多修改一下
SHUTDOWN


[b]2、连接器(Connectors)组件[/b]

连接器分为四种:

HTTP 连接器

SSL 连接器

AJP 连接器

proxy(JK)连接器

其中 proxy(JK)连接器一般不在 Tomcat 作配置,使用的也不多,所以这里不作过多解释。

一般来说,我们都不会让 Tomcat 直接面向用户去提供服务,而是会在 Tomcat 前端部署一个 Nginx 或者 Apache 作为反向代理。所以 Tomcat 在与前端的 Nginx/Apache 进行交互的时候有多种协议。

如果代理服务器发送过来的请求仅是以 http 建立连接请求,那么在定义 Tomcat 的连接器的时候使用 http 协议 即可。

如果想要更加高效,拥有更高的性能的话,也可以定义一个 AJP 连接器,使用 AJP 协议进行连接。当然这个时候的代理必须是 Apache,Nginx 不能够与 Tomcat 使用 AJP 建立连接。

AJP 协议是 Tomcat 独有的一种协议,能够提高与前端代理交互的性能,而这个协议只能是 Apache 才能够进行交互。

/usr/local/tomcat/conf/server.xml
中,我们看到连接器定义了两种:



HTTP 协议的连接器默认监听在
8080
端口,所以我们通过浏览器访问的时候就是通过 HTTP 协议进行访问的。

AJP 协议的监听器默认监听在
8009
端口,这个端口实际上是在与 Apache 对 Tomcat 进行代理的时候使用的。

定义连接器时可以配置的属性非常多,但通常定义 HTTP 连接器时必须定义的属性只有
port
,定义 AJP 连接器时必须定义的属性只有
protocol
,因为默认的协议为 HTTP 。以下为常用属性的说明:

address: 指定连接器监听的地址,默认为所有地址,即 0.0.0.0,如果不想监听本机的所有端口就需要在 protocal 后面加上 address

maxThreads: 支持的最大并发连接数,默认为 200

port: 监听的端口,默认为 0

protocol: 连接器使用的协议,默认为 HTTP/1.1,定义 AJP 协议时通常为 AJP/1.3

redirectPort:如果某连接器支持的协议是 HTTP,当接受客户端发来的 HTTPS 请求时,则转发至此属性定义的端口

connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为 60000,即一分钟

enableLookups: 是否通过 request.getRemoteHost( ) 进行 DNS 查询以获取客户端的主机名,默认为 true,建议修改为 false

acceptCount: 设置等待队列的最大长度,通常在 tomcat 所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中

现在来说说 SSL 连接器。一般这里的 SSL 都是自行认证,自己提供认证然后授权,操作也不多,我在之前的博客有提到自建私有 CA:Openssl 与CA认证

对于怎么建立私有 CA 这里不过多描述,说说连接器怎么定义。

<Connector port="8443"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" acceptCount="100" debug="0" scheme="https" secure="true"
clientAuth="false" sslPortocol="TLS"
/>


参数解释:

maxThreads: 最大的并发线程数

minSpareThreads: 最小空闲线程

maxSpareThreads: 最大空闲线程

enableLookups: 不允许进行 DNS 查询获取客户端的主机名

acceptCount: 并发连接数量

debug:不开启

scheme:开启 https 连接

secure:安全连接

clientAuth:不需要客户端发送证书到服务器端

[b]2、引擎(Engine)组件[/b]

Engine 需要 defaultHost 属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件



组件介绍:

defaultHost:Tomcat 支持基于 FQDN 的虚拟主机,这些虚拟主机可以通过在 Engine 容器中定义多个不同的Host组件来实现;但如果此引擎的连接器收到一个发往非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在 Engine 中定义的多个虚拟主机的主机名称中至少要有一个跟 defaultHost 定义的主机名称同名

name:Engine组件的名称,用于日志和错误信息记录时区别不同的引擎;

[b]3、主机(Host)组件[/b]

位于 Engine 容器中用于接受请求并进行相应处理的主机或者虚拟主机



appBase:此虚拟主机的根目录,Host 的 webapps 目录,即存放非归档的 web 应用程序的目录或归档后的WAR文件的目录路径;可以使用基于 $CATALINA_HOME 的相对路径,也可以是绝对路径;

autoDeploy:在 Tomcat 处于运行状态时放置于 appBase 目录中的应用程序文件是否自动进行自动部署;默认为 true;

unpackWars:在启用此 webapps 时是否对 WAR 格式的归档文件先进行展开;默认为true;

如果一个主机有两个或两个以上的主机名,额外的名称均可以以别名的形式进行定义,如下:

<Host name="www.baidu.com" appBase="webapps" unpackWARs="true">
<Alias>baidu.com</Alias>
</Host>

c8a0

相当于用户在输入
baidu.com
后,系统会自动跳转到
www.baidu.com


[b]4、上下文(Context)组件[/b]

Context 在某些意义上类似于 Apache 中的路径别名,一个 Context 定义用于标识 Tomcat 实例中的一个 Web 应用程序。

示例:

<Engine name="Catalina" defaultHost="localhost">
#定义了一个虚拟主机 localhost ,根目录为 webapps
<Context path="" docBase="ROOT"/>
#定义了一个 web 应用程序,就是当用户访问根目录的时候,跳转到 ROOT 目录中
<Context path="/bbs" docBase="/web/bbs"
#定义了一个 web 应用程序,就是当用户访问 /bbs 目录的时候,跳转到 /web/bbs 目录中
reloadable="true" crossContext="true"/>
</Host>

<Host name="mail.baidu.com" appBase="/web/mail">
# 定义了一个虚拟主机,mail.baidu.com ,主页在 /web/mail 下
<Context path="/" docBase="ROOT"/>
# 当用户访问主页的时候,跳转到 ROOT 目录中
</Host>
</Engine>


定义一个 Context 就相当于在 Apache 中定义一个虚拟主机一样,只要指定访问路径即可:

<!-- Tomcat Root Context -->
<Context path="" docBase="/web/webapps"/>

<!-- buzzin webapp -->
<Context path="/bbs"
docBase="/web/threads/bbs"
reloadable="true">
</Context>

<!-- chat server -->
<Context path="/chat" docBase="/web/chat"/>

<!-- darian web -->
<Context path="/darian" docBase="darian"/>


一些常用的参数介绍:

docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;切记,docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系,比如,如果appBase为deploy,而docBase绝不能为deploy-bbs类的名字;

path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径;如果context定义在一个单独的xml文件中,此属性不需要定义;

reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false;

[b]5、领域(Realm)组件[/b]

一个 Realm 表示一个安全上下文,它是一个授权访问某个给定 Context的用户列表和某用户所允许切换的角色相关定义的列表。因此,Realm 就像是一个用户和组相关的数据库。定义 Realm 时惟一必须要提供的属性是 classname,它是 Realm 的多个不同实现,用于表示此 Realm 认证的用户及角色等认证信息的存放位置。

[b]6、阀门(Valve)组件[/b]

Valve 类似于过滤器,它可以工作于 Engine 和 Host/Context 之间、Host 和 Context 之间以及 Context 和 Web 应用程序的某资源之间。一个容器内可以建立多个 Valve,而且 Valve 定义的次序也决定了它们生效的次序。一般使用这个组件来定义访问日志以及权限控制。

<Context path="/probe" docBase="probe">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1"/>
</Context>


.
在里面要转义,表示只允许当前主机访问。

Tomcat 架构

[b]LNMT (Linux + Nginx + Mysql + Tomcat)架构:[/b]

这里就省略 Mysql + Tomcat ,之后我会在 Memcached 中提到。

# yum install -y nginx
# cp /etc/nginx/nginx.conf{,.bak}
# vim /etc/nginx/nginx.conf
加上这样一句话:
location ~* \.(jsp|do)$ {
proxy_pass http://web1.magedu.com:8080; #表示将所有的以 jsp/do 结尾的请求都代理到后端的虚拟主机 web1.magedu.com:8080 中
}


核心的配置就是上面的那句话,这里对 Nginx 的优化以及反向代理不作过多的描述。

[b]LAMT (Linux + Apache + Mysql + Tomcat)架构:[/b]

Apache 中模块众多,要想开启反向代理,必须首先让 Apache 装载反向代理模块。使用命令
# httpd -M
查看是否装载 httpd 的反向代理模块:



如果没有请自行将这三个模块启动起来。CentOS 7 在
/etc/httpd/conf.modules.d/00-proxy.conf
这个文件下,CentOS 6 在
/etc/httpd/conf/httpd.conf
文件中。

编辑配置文件,对 Tomcat 进行反向代理(这里以 CentOS 7 为例):

#  vim /etc/httpd/conf.d/vhosts.conf

添加如下代码:

<VirtualHost *:80>
ServerName web1.magedu.com
ProxyVia On                 将代理主机名称发往后端服务器,在请求首部加上 Via 字段,表示反代主机的 IP
ProxyRequests Off           关闭正向代理。Apache 能够支持正代与反代,但是同一时间只能支持一种。所以开启反代的时候要显式关闭正代
proxyPreserveHost On        是否支持在向后端的主机进行请求的时候以主机名进行请求。因为默认我们都是以 IP 访问的后端主机,但是如果用户是以主机名进行访问的话,那么我们是否以主机名进行代理。
<Proxy *>                   CentOS 7 中要将反向代理进行授权。这里表示授权所有的代理权限
Require all granted
</Proxy>
ProxyPass / http://172.18.49.8:8080/            表示将所有的内容全部反代至后端的主机
ProxyPassReverse / http://172.18.49.8:8080/ <Location />                对代理的内容进行授权。表示用户允许访问哪些 URL 。对代理的路径进行授权
Require all granted
</Location>
</VirtualHost>


以上是基于 HTTP 协议进行的反向代理。我们说过,Apache 在与后端的 Tomcat 进行交互的时候有两种交互模式,一种是基于 HTTP 协议进行交互,一种是基于 AJP 协议进行交互。而在配置 AJP 协议的时候,只需要在 HTTP 的配置上修改几个参数即可

ProxyPass / ajp://172.18.49.8:8009/
ProxyPassReverse / ajp://172.18.49.8:8009/


AJP 协议监听的是
8009
端口,所以端口也需要修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息