一:connector组件:接受解析请求
进入tomcat的请求可以根据tomcat的工作模式分为
tomcat作为应用程序服务器:请求来自前端的web服务器,这可能是apache,iis,nginx等
tomcat作为独立服务器,请求来自于web浏览器;
tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接受来自于客户端的请求,一个引擎可以有一个或多个连接器,以适应多种请求方式。
定义连接器可以使用多种属性,有些属性也只适用于特定的连接器类型,一般说来,常见于server.xml中的连接器类型通常有4种;
1)http连接器
2)ssl连接器
3)ajp1.3连接器
如:定义一个server.xml的http连接器。
<connector port="8080" protocol="http/1.1"
maxThreads="150" connectiontimeout="20000"
redirectport="8443"/>
定义连接器时可以配置的属性非常多,但通常定义HTTP连接器时必须定义的属性只有“port”定义AJP链接器时必须定义的属性只有“protocol”,因为默认
的协议为http。
1)address:指定连接器监听的地址,默认为所有地址,即0.0.0.0
2)maxthreads:支持最大并发连接数,默认为200
3)port:监听的端口,默认为0。
4)protocol:连接器使用的协议,默认为http/1.1定义AJP协议时通常为AJP/1.3
5)redirectport:如果某连接器支持的协议是http,当接受客户端发来的https请求时,则转发至此属性定义的端口
6)connectiontimeout:等待客户端发送的请求的超时时间,单位为毫秒,默认为60000,即1分钟
7)enablelookups:是否通过request.getremotehost()进行DNS查询以获得客户端的主机名,默认为true;
8)acceptcount:设置等待队列的最大长度;通常在tomcat所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中
定义一个多属性的ssl连接器
<connector port="8443"
maxThreads="150" minSpareThreads(最小空闲线程)="25" maxSpareThreads="75"
enablelookups="false" acceptCount="100" debug(关闭这个功能)="0" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
redirectport="8443"/>
engine组件:
engine是servlet处理器的一个实列,即servlet引擎,默认为定义在server.xml中的catalina,engine需要defaulthost属性来为其定义一个接受
所有发往非明确定义虚拟主机的请求的host组件,如实列:
<engine name="catalina" defaultHost="localhost">
常用的属性定义:
defaultHost:tomcat支持基于FQDN的虚拟主机,这些虚拟主机可以通过在engine容器中定义多个不同的host组件来实现;但如果此引擎的连接器收到
一个发往非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此在engine中定义的多个虚拟主机的主机名称中至少
要有一个跟defaulthost定义的主机名称同名;
name:engine组件的名称,用于日志和错误信息记录时区别不同的引擎。
engine容器中可以包含realm,host,listener和valve子容器。
host组件:
位于engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面实列中的定义;
<Host name="localhost" appBase="webapps"
unpacWARS="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
常见的属性说明:
1)appBase:此host的webapps目录,即存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以使用基于$CATALINA_HOME的相对
路径;
2)autoDeploy:在tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true
3)unpackWars:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;
主机实列架构:
<host name="web1.magedu.com"(虚拟主机名称) appBase="/data/webapps/" unpackWARs="true" autoDeploy="true">
context path="" docBase="ROOT" reloadable="true" />
context path="/shop" docBase="shopxx" reloadable="truef" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</host>
我们创建一个主机实列:
[root@localhost webapps]# vim /usr/local/tomcat/conf/server.xml 编辑tomcat的著配置文件,在引擎(engine)创建一个虚拟主机,如果有多个可创建多个host
<Host name="web1.magedu.com" appBase="/data/webapps/" unpackWARs="true" autoDeploy="true">
<Alias>www.yurun.com</Alias> 这项表示当我们的主机有多个主机名时,使用Alias定义多个主机名,实现多主机名访问
<Context path="" docBase="ROOT" reloadable="true" /> 这项说明我们当访问根目录时映射至/data/webapps/ROOT下 reloadable:表示重新装箱。
<Context path="/shop" docBase="shopxx" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
[root@localhost webapps]# pwd
/data/webapps
[root@localhost webapps]# mkdir ROOT
[root@localhost webapps]# cd ROOT/
[root@localhost ROOT]# ls
classes index.jsp lib META-INF WEB-INF
[root@localhost ROOT]#
[root@localhost webapps]# vi /etc/hosts
[root@localhost webapps]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.5.100.119 web1.magedu.com
10.5.100.119 www.yurun.com
[root@localhost webapps]#
[root@localhost webapps]# curl www.yurun.com:8080
<html>
<head>
<title>JSP Test Page</title>
</head>
<body>
hello,word.
</body>
</html>
[root@localhost webapps]# curl web1.magedu.com:8080
<html>
<head>
<title>JSP Test Page</title>
</head>
<body>
hello,word.
</body>
</html>
[root@localhost webapps]#
注意:path给定的路径不能以"/" 结尾。
value组件:
value类似于过滤器,它可以工作于engine和host/context之间,host和context之间以及context和应用程序的某资源之间,一个容器内可以建立多个value,而且value定义的次序也决定了他们生效的次序,
tomcat6中实现了多种不同的value
accessLogValue:访问日志value
ExtendedAccessvalue:扩展功能的访问日志value
JDBCAccessLogValue:通过JDBC将访问日志信息发送到数据库中;
RequestDumperValue:请求转储Value
RemoteAddrValue;基于远程地址的访问控制
RemoteHostvalue:基于远程主机名称的访问控制
semaphoreValue:用于控制tomcat主机上任何容器上的并发访问数量;
JvmRouteBinderValue:在配置多个tomcat为以apache通过mod_proxy或mod_jk作为前端的集群架构中,当期望停止某节点时,可以通过
此value将用记请求定向至备用节点;使用此value,必须使用JvmRouteSessionIDBinderListener:
ReplicationValue:专用于tomcat集群架构中,可以在某个人请求session信息发生更改时触发session数据在各节点进行复制;
singlesignon:将两个或多个需要对用户进行认证webapp在认证用户时链接在一起,即一次认证即可所有链接在一起的webapp;
clustersinglesingon:对singlesignon的扩展,专用于tomcat集群中,需要结合clustersinglesignonlistener进行工作,
RemoteHostvalue和RemoteAddrValue可以分别用来实现基于主机名称和基于ip地址的访问控制,控制本身可以通过allow或deny来进行定义。
这有点类似于apache的访问控制功能:如下面value则实现了仅允许本机访问/probe
<context path="/probe" docBase="probe">
<value className="org.apache.catalina.values.RemoteAddrValve
allow="127\.0\.0\.1"/>
</context>
其中相关属性定义有:
1)className:相关的java实现的类名,相应于分别应该为org.apache.catalina.valves.RemoteHostvalve或org.apache.catalina.valves.RemoteAddrvalve;
2)allow;以逗号分开的允许访问的ip地址列表,非明确allow的地址均被deny;
3)deny:以逗号分开的禁止访问的ip地址列表,支持正则表达式,使用方式同allow;
如何实现LNMT
LNMT的访问流程: client ---->nginx------>reverse_proxy—>http---->tomcat (http connector)
ip地址 | 角色 |
---|---|
10.5.100.146(node4) | nginx主机 |
10.5.100.119(centos6) | tomcat主机 |
一:安装nginx,编辑配置文件
[root@node4 ~]# yum install nginx -y
[root@node4 ~]# vim /etc/nginx/nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
}
location ~* \.(jsp|do)$ { 基于访问的url进行匹配,不区分大小写匹配访问.jsp和.do结尾的,交给后端tomcat服务器的8080端口
proxy_pass http://web1.magedu.com:8080;
}
[root@node4 ~]# systemctl start nginx
[root@node4 ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.5.100.119 web1.magedu.com
10.5.100.119 www.yurun.com
[root@node4 ~]# curl 10.5.100.146/index.jsp
<html>
<head>
<title>JSP Test Page</title>
</head>
<body>
hello,word.
</body>
</html>
[root@node4 ~]#
如何实现LAMT
LAMT的访问流程: client ---->http---->httpd----->reverse_proxy---->{http|ajp} ---->tomcat {http connector|ajp connector}
一:安装httpd,编辑配置文件,构建虚拟主机。
[root@node4 conf.d]# pwd
/etc/httpd/conf.d
[root@node4 conf.d]# vi a.conf
<VirtualHost *:80>
ServerName web1.magedu.com
ProxyVia on
ProxyRequests off
ProxyPreserveHost on
<Proxy *>
Require all granted
</proxy>
ProxyPass / http://10.5.100.119:8080/
ProxyPassReverse / http://10.5.100.119:8080/
<Location />
Require all granted
</Location>
</VirtualHost>
[root@node4 conf.d]#
[root@node4 conf.d]# curl web1.magedu.com:8080
<html>
<head>
<title>JSP Test Page</title>
</head>
<body>
hello,word.
</body>
</html>
基本组件已经完成讲述。