一、Tomcat是什么
Tomcat是Apache在符合J2EE的JSP、Servlet标准下开发的一个JSP服务器,tomcat侧重于servlet引擎,如果以standalone方式运行,可以作为web服务器来使用,支持JSP;tomcat是由java语言开发的,需要在java虚拟机上进行工作。
二、Tomcat的常见的组件
服务器:Server | Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例 |
服务:Service | 一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器 |
连接器:Connector | 负责连接客户端请求至Servlet容器内的Web应用程序;默认端口为http协议的8080;ajp协议的8009;https的8443 |
引擎:Engine | 检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端 |
虚拟主机:Host | 类似于apache的虚拟主机 |
上下文:Context | 配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置 |
三、Tomcat的配置文件说明
server.xml | Tomcat的主配置文件,包含Service, Connector, Engine,Valve, Hosts主组件的相关配置信息; |
web.xml | 遵循Servlet规范标准的配置文件,用于配置servlet |
catalina.policy | Java相关的安全策略配置文件 |
catalina.properties | Tomcat内部package的定义及访问相关的控制 |
tomcat-users.xml |
认证时用到的相关角色、用户和密码等信息; Tomcat自带的manager默认情况下会用到此文件 |
logging.properties | 日志记录器相关的配置信息 |
四、Tomcat简单的操作、基于nginx和apache的反向代理实现
前提:在centos7上安装tomcat软件包;并启动,测试访问!
准备:2台centos7虚拟主机,node1:172.16.116.231 ; node2:172.16.116.232
# yum install -y tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp # systemctl start tomcat # [[email protected] tomcat]# systemctl start tomcat.service [[email protected] tomcat]# ss -tanl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* LISTEN 0 100 :::8009 :::* LISTEN 0 100 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
4.1、部署webapp
deploy:将webapp的源文件放置于目标目录、配置tomcat服务器能够基于context.xml文件中定义的路径来访问此webapp; 将其特有类通过class loader装载至tomcat;可以自动部署和手动部署,这里介绍手动部署中的热部署,使用Tomcat自带的manager工具
[[email protected] ~] # cd /etc/tomcat [[email protected] tomcat]# vim tomcat-users.xml <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> [[email protected] tomcat]# systemctl restart tomcat 设置完成后,可以使用tomcat用户名和对应的密码访问Server Status|Manager App|Host Manager
4.2、Host定义
[[email protected] tomcat]# vim server.xml //编辑server.xml文件 <Host name="node1" appBase="/web/webapps" autoDeploy="false"> //添加node1虚拟主机 <Context path="" docBase="" reloadable="true"/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> //定义日志格式 </Host> [[email protected] tomcat]# mkdir -pv /web/{logs,webapps} //提供测试页面 <%@ page language="java" %> <html> <head><title>Tomcat1 on node1</title></head> <body> <h1><font color="red">Tomcat1.node1.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("node1.com","node1.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> ~ windows设置hosts文件: 172.16.116.231 node1
4.3、修改默认虚拟主机的方法
# vim /etc/tomcat/server.xml <Engine name="Catalina" defaultHost="localhost"> //defaultHost设置为默认的host<name>即可
4.4、LNT实现方法(nginx反向代理用户请求至tomcat)
[[email protected] ~]# yum install -y nginx //在node2上安装nginx [[email protected] ~]# vim /etc/nginx/nginx.conf //编辑nginx配置文件,加入下面一句 location / { proxy_pass http://node1:8080/ //将客户端的所有请求都反向代理至node1 } //如果想动静分离,静态请求由nginx响应,动态请求由node1响应,需要进行下面的修改即可 location ~* \.(jsp|do)$ { proxy_pass http://node1:8080/ //动静分离 }
4.5、LAT实现方法(apache反向代理用户请求至tomcat)
准备工作;编辑 /etc/httpd/conf/httpd.conf将中心主机的DocumentRoot注释
4.5.1、mod_proxy_http
[[email protected] ~]# cd /etc/httpd/conf.d/ [[email protected] conf.d]# vim mod_proxy_http.conf <VirtualHost *:80> ServerName node2 //虚拟主机名 ProxyVia On //是否在响应头部加入via,即代理的主机名 ProxyRequests Off //关闭正向代理 ProxyPreserveHost On <Proxy *> Require all granted //允许所有主机访问 </Proxy> ProxyPass / http://node1:8080/ ProxyPassReverse / http://node1:8080/ //ProxyPassReverse作用就是反向代理 <Location /> Require all granted </Location> </VirtualHost>
4.5.2、mod_proxy_ajp
AJP(Apache JServ Protocol)是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。WEB服务器通过 TCP连接 和 SERVLET容器 连接
[[email protected] conf.d]# vim mod_proxy_ajp.conf <VirtualHost *:80> ServerName node2 ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / ajp://node1:8009/ ProxyPassReverse / ajp://node1:8009/ //将协议和端口改为ajp和8009即可 <Location /> Require all granted </Location> </VirtualHost> //测试没问题,就不截图了~~
4.5.3、mod_jk
mod_jk 简称JK,是Apache服务器的一个可插入模块,用以为Apache提供处理JSP/Servlet的能力。mod_jk实质上是Apache与Tomcat的连接器,并附带提供集群和负载均衡的功能。
apxs
是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。
(1) mod_jk:额外编译安装
# yum groupinstall "Development tools" # cd tomcat-connectors-1.2.40-src/native # yum install -y httpd-devel # which apxs /usr/bin/apxs # ./configure --with-apxs=/usr/bin/apxs #make && make install
(2)编辑mod_jk的模板配置文件
[[email protected] conf.d]# vim mod_jk.conf LoadModule jk_module modules/mod_jk.so //让httpd加载jk模块 JkWorkersFile /etc/httpd/conf.d/workers.properties //jk的worker文件 JkLogFile logs/mod_jk.log //日志文件 #JkLogLevel debug JkMount /* Tomcat1 JkMount /status/ stat1
(3)workers配置文件:workers.properties
[r[email protected] conf.d]# vim workers.properties worker.list=Tomcat1,stat1 worker.Tomcat1.port=8009 worker.Tomcat1.host=172.16.116.231 worker.Tomcat1.type=ajp13 //mod_jk只能使用ajp13协议 worker.Tomcat1.lbfactor=1 //权重 worker.stat1.type = status //这个页面最好加入用户认证
五、tomcat 集群;实现session会话保持的3种方法介绍
5.1、基于session会话绑定实现方法,nginx和apache测试!
在原来的基础上再加入一台虚拟机做反向代理使用;node3:172.16.116.233
5.1.1、nginx负载均衡至后端tomcat方法;基于session会话绑定实现
<1> node1: 172.16.116.231 //配置tomcat1;修改并加入虚拟主机node1 # vim /etc/tomcat/server.xml <Engine name="Catalina" defaultHost="node1"> <Host name="node1" appBase="/web/webapps/" autoDeploy="false" > <Context path="" docBase="" reloadable="true"/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <2> node2: 172.16.116.232 //配置tomcat2;修改并加入虚拟主机node2, # vim /etc/tomcat/server.xml <Engine name="Catalina" defaultHost="node2"> <Host name="node2" appBase="/web/webapps/" autoDeploy="false" > <Context path="" docBase="" reloadable="true"/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <3> node3: 172.16.116.233 //配置nginx负载均衡的反向代理 # vim /etc/nginx/nginx.conf upstream tomcatservs { //在http段加入upstream上游服务器 ip_hash ; //源地址hash,将同一源地址的请求始终定向至某一上游服务器 server node1:8080; //达到session会话绑定的目的 server node2:8080; } location / { //在server段中加入反向代理 proxy_pass http://tomcatservs/ }
5.1.2、apache负载均衡至后端tomcat方法;基于session会话绑定实现
通过apache3种反向代理的方式进行测试
apache: | tomcat |
mod_proxy mod_proxy_http mod_proxy_balancer |
http connector //http协议连接器 |
mod_proxy mod_proxy_ajp mod_proxy_balancer |
ajp connector //ajp协议连接器 |
mod_jk | ajp connector //ajp协议连接器 |
▲▲▲httpd负载均衡集群使用到的选项总结▲▲▲
lbfactor表示:后台服务器负载到由Apache发送请求的权值,该值为1到100之间的任何值。 BalancerMember:负载均衡集群中的成员 lbmethod表示:负载载均衡策略。 lbmethod=byrequests 按照请求次数均衡(默认) lbmethod=bytraffic 按照流量均衡 lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器) ProxyPass表示:所有的test请求都会重定向到balancer://lbcluster1/处理。balancer是内置负载。 ProxyPassReverse表示:反向代理,也就是将所有的请求反向代理到负载均衡后的应用url路径中。 stickysession表示:进行Session复制使用 |
①mod_proxy_http 、http connector
node1 : 172.16.116.231 <Engine name="Catalina" defaultHost="node1" jvmRoute="Tomcat1"> //Engine加入jvmRoute标识 node2 : 172.16.116.232 <Engine name="Catalina" defaultHost="node1" jvmRoute="Tomcat2"> //Engine加入jvmRoute标识 node3 : 172.16.116.233 [[email protected] conf.d]# vim mod_proxy_http.conf header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <proxy balancer://lbcluster1> BalancerMember http://172.16.116.231:8080 loadfactor=1 route=Tomcat1 BalancerMember http://172.16.116.232:8080 loadfactor=1 route=Tomcat2 ProxySet stickysession=ROUTEID //根据routeid做session绑定 </proxy> <VirtualHost *:80> ServerName node3 ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / balancer://lbcluster1/ //注意,要使用balancer ProxyPassReverse / balancer://lbcluster1/ <Location /> Require all granted </Location> </VirtualHost>
②mod_proxy_ajp、ajp connector
[[email protected] conf.d]# vim mod_proxy_ajp.conf //只需修改这个地方,其它不用修改即可实现 BalancerMember ajp://172.16.116.231:8009 loadfactor=1 route=Tomcat1 BalancerMember ajp://172.16.116.231:8009 loadfactor=1 route=Tomcat1
③mod_jk、ajp connector
[[email protected] conf.d]# vim mod_jk.conf LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/conf.d/workers.properties //集群worker相关配置 JkLogFile logs/mod_jk.log JkLogLevel error JkMount /* lbcluster1 JkMount /status/ stat1 [[email protected] conf.d]# vim workers.properties worker.list = lbcluster1,stat1 //worker列表 worker.Tomcat1.type = ajp13 //Tomcat1是node1节点上的运行tomcat的jvm标识 worker.Tomcat1.host = 172.16.116.231 //ip或主机名都可以 worker.Tomcat1.port = 8009 worker.Tomcat1.lbfactor = 1 worker.Tomcat2.type = ajp13 //Tomcat2是node2节点上的运行tomcat的jvm标识 worker.Tomcat2.host = 172.16.116.232 //ip或主机名都可以 worker.Tomcat2.port = 8009 worker.Tomcat2.lbfactor = 1 //权重 worker.lbcluster1.type = lb worker.lbcluster1.sticky_session = 0 //是否绑定session会话;0为不绑定,1为绑定 worker.lbcluster1.balance_workers = Tomcat1, Tomcat2 //lbcluster1集群成员 worker.stat1.type = status
5.2、基于session 集群的方法,也就是session共享
session manager:会话管理器;常用的管理器有4种
StandardManager 标准会话管理器 |
|
PersistentManager 持久会话管理器 |
FileStore :文件存储,可以存在nfs服务器上 JDBC :基于jdbc存储在后端的关系型数据库中,如mysql |
DeltaManager |
Manager用来在节点间拷贝Session,默认使用DeltaManager, DeltaManager采用的一种all-to-all的工作方式,即集群中的节点会把 Session数据向所有其他节点拷贝,而不管其他节点是否部署了当前应用 |
BackupManager 备用会话管理器 |
当集群中的节点数量很多并且部署着不同应用时,可以使用 BackupManager,BackManager仅向部署了当前应用的节点拷贝Session |
这里主要介绍DeltaManager的实现方法:
前端的node3负载均衡的相关配置不需要改变,使用上述3种方式都可以,只需要在tomcat节点上修改;node1:172.16.116.231 ; node2:172.16.116.232 需要做如下的修改 ;根据官方文档实现
http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
[[email protected] ~]# mkdir /web/webapps/ROOT/{classes,lib,META-INF,WEB-INF} -pv [[email protected] ~]# cp /usr/share/tomcat/webapps/ROOT/WEB-INF/web.xml /web/webapps/ROOT/WEB-INF/ <Host name="node2" appBase="/web/webapps" autoDeploy="false"> <Context path="" docBase="ROOT" reloadable="true"/> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.16.7" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="172.16.116.232" port="4000" autoBind="100" selectorTimeout="5000" </Sender> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> [[email protected] ~]# vim /web/webapps/ROOT/WEB-INF/web.xml <distributable/>
▲▲▲特别要说明的是▲▲▲
tomcat集群中的session管理,主要有两种方式:
1).粘性session
表示从同一客户端发来的请求都将有集群中的同一个tomcat进行处理。配置方式是在上面的workers.properties文件中
Xml代码
- worker.lbcontroller.sticky_session=1
粘性session的好处在不会在不同的tomcat上来回跳动处理请求,但是坏处是如果处理该session的tomcat崩溃,那么之后的请求将由其他tomcat处理,原有session失效而重新新建一个新的session,这样如果继续从session取值,会抛出nullpointer的访问异常。
2).session复制
session复制是指tomcat彼此之间通过组播方式将session发到各个tomcat实例上,如果其中一个访问出错,则另外tomcat仍然具有有效的session内容,从而能正常接管其session。坏处是当tomcat实例很多,或者用户在session中有大量操作时,组播发送的信息量十分惊人。session复制配置则是在发布的web应用程序中的web.xml中添加
Xml代码
- <distributable/>
以上就是这次讲到的内容,下次再介绍session服务器的实现方法,基于msm的实现过程! 谢谢O(∩_∩)O~~