目录
安装tomcat
tomcat目录结构及配置文件构成以及主配置文件server.xml ,tomcat中的组件
实现反代tomcat的方法
nginx+tomcat cluster
http(mod_porxy_http)+tomcat cluster
http(mod_porxy_ajp)+tomcat cluster
http(mod_jk)+tomcat cluster
实现tomcat会话保持
session sticky
session cluster
session server
相遇tomcat (๑• . •๑)
tomcat的核心组件
顶级类组件:Server
服务类组件:Service
连接器组件:Connector
容器类组件,即可部署webapp的程序:Engine, Host, Context
被嵌套类组件:valve, logger, realm,
安装tomcat
# rpm -ivh jdk-7u79-linux-x64.rpm # vim /etc/profile.d/java.sh export JAVA_HOME=/usr/java/latest export PASH=$JAVA_HOME/bin:$PASH # . /etc/profile.d/java.sh 重读 # java –version 显示版本 java version "1.7.0_79" Java(TM) SE Runtime Environment (build 1.7.0_79-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode) # tar xf apache-tomcat-8.5.23.tar.gz -C /usr/local # cd /usr/local # ls apache-tomcat-8.5.23 etc include lib64 sbin src bin games lib libexec share # ln -sv apache-tomcat-8.5.23 tomcat `tomcat' -> `apache-tomcat-8.5.23' # ll total 44 drwxr-xr-x. 9 root root 4096 Nov 13 09:38 apache-tomcat-8.5.23 drwxr-xr-x. 2 root root 4096 Sep 23 2011 bin drwxr-xr-x. 2 root root 4096 Sep 23 2011 etc drwxr-xr-x. 2 root root 4096 Sep 23 2011 games drwxr-xr-x. 2 root root 4096 Sep 23 2011 include drwxr-xr-x. 2 root root 4096 Sep 23 2011 lib drwxr-xr-x. 2 root root 4096 Sep 23 2011 lib64 drwxr-xr-x. 2 root root 4096 Sep 23 2011 libexec drwxr-xr-x. 2 root root 4096 Sep 23 2011 sbin drwxr-xr-x. 5 root root 4096 Nov 10 11:45 share drwxr-xr-x. 2 root root 4096 Sep 23 2011 src lrwxrwxrwx. 1 root root 20 Nov 13 09:39 tomcat -> apache-tomcat-8.5.23 # cd tomcat/ # vim /etc/profile.d/tomcat.sh export CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOME/bin:$PATH # . /etc/profile.d/tomcat.sh # version.sh Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Server version: Apache Tomcat/8.5.23 Server built: Sep 28 2017 10:30:11 UTC Server number: 8.5.23.0 OS Name: Linux OS Version: 2.6.32-642.el6.x86_64 Architecture: amd64 JVM Version: 1.7.0_79-b15 JVM Vendor: Oracle Corporation # catalina.sh version Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Server version: Apache Tomcat/8.5.23 Server built: Sep 28 2017 10:30:11 UTC Server number: 8.5.23.0 OS Name: Linux OS Version: 2.6.32-642.el6.x86_64 Architecture: amd64 JVM Version: 1.7.0_79-b15 JVM Vendor: Oracle Corporation # ss –tnl 查看8080端口是否被监听 # catalina.sh start # ss –tnlp :::8080 :::* users:(("java",3225,45))
手动添加一个测试应用程序 # cd /usr/local/tomcat/webapps # mkdir myapp/{lib,classes,WEB-INF,META-INF} –pv # vim myapp/index.jsp <%@ page language="java" %> <%@ page import="java.util.*" %> <html> <head>
<title>JSP Test Page</title> </head> <body> <% out.println("Hello,world"); %> </body> </html>
tomcat自带的应用程序访问
当遇到如下问题时,可采用以下方法尝试解决
新安装的tomcat,用其他机器访问tomcat的Server Status、Manager App、Host Manager三个页面均显示403(本机访问没有问题),conf/tomcat-users.xml里已添加配置:
<role rolename=”manager-gui”/>
<role rolename=”admin-gui”/>
<user username=”tomcat” password=”qazwsx” roles=”manager-gui,admin-gui”/>
重启之后,还是403
查找网上解决办法无果,大部分网上的文章都只提到了在tomcat-users.xml里添加上面的语句,无法解决,通过查阅官方文档,终于找到问题所在,打开webapps下的host-manager和manager,都有一个共同的文件夹META-INF,里面都有context.xml,这个文件的内容是:
<Context antiResourceLocking=”false” privileged=”true” >
<Valve className=”org.apache.catalina.valves.RemoteAddrValve”
allow=”127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1″ />
<Manager sessionAttributeValueClassNameFilter=”java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap”/>
</Context>
这段代码的作用是限制来访IP的,127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1,是正则表达式,表示IPv4和IPv6的本机环回地址,所以这也解释了,为什么我们本机可以访问管理界面,但是其他机器确是403。
找到原因了,那么修改一下这里的正则表达式即可,比如我们只允许内网网段192.168.访问管理页面,那么改成这样就可以:
<Context antiResourceLocking=”false” privileged=”true” >
<Valve className=”org.apache.catalina.valves.RemoteAddrValve”
allow=”192.168.*.*” />
</Context>
修改完毕,重新打开tomcat,问题解决
相识tomcat (>^ω^<)喵
tomcat的目录结构
bin:脚本,及启动时用到的类;
conf:配置文件目录;主配置文件server.xml
lib:Java类库;
logs:日志文件目录;
temp:临时文件目录;
webapps:webapp的默认目录;
work:工作目录;存放编译后的字节码文件;
tomcat的配置文件构成:
server.xml:主配置文件;
web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置;
context.xml:每个webapp都可以使用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认 配置;
tomcat-users.xml:用户认证的账号和密码文件;
catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略;
catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数;
logging.properties:日志系统相关的配置
JAVA WebAPP的组织结构:
有特定的组织形式,层次型的目录结构:主要包含了servlet代码文件,JSP页面文件、类文件、部署描述符文件等。 /: webapps的根目录
index.jsp:webappde主页;
WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp自用的web.xml;
META-INF/:当前webapp的私有资源路径;通常用于存储当前webapp自用的context.xml配置文件;
classes/:类文件,webapp的私有类;
lib/:类文件,当前webapp的私有类,被打包为jar格式;
webapp归档格式:
.war:webapp 归档文件
.jar:EJB的类打包文件(类库);
.rar:资源适配器类打包文件;
.ear:企业级应用程序;
部署webapp相关的操作
deploy:部署,将webapp的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问此webapp;将其特有的类和依赖的类通过 class loader装载至tomcat;
部署有两种方式:
自动部署:auto deploy
手动部署:
冷部署:把webapp复制到指定的位置,而后才启动tomcat;
热部署:在不停止tomcat的前提下进行部署;部署工具:manager、ant脚本、tcd(tomcat client deployer)等;
undeploy:反部署,停止webapp,并从tomcat实例上拆除其部分文件和部署名;
start:启动处于停止状态的webapp;
stop:停止webapp,不再向用户提供服务;其类依然在jvm上;
redeploy:重新部署;
Tomcat主配置文件结构:server.xml
<Server> <Service> <connector/> <connector/> … <Engine> <Host> <Context/> <Context/> … </Host> <Host> … </Host> … </Engine> </Service> </Server>
主配置文件server.xml ,tomcat中的组件:
【 Server 】:即一个tomcat实例;
【 Service组件 】:用于实现将一个或多个connector组件关联至一个engine组件;
【 Context组件 】:
负责接收请求,常见的有三类http/https/ajp;
进入tomcat的请求可分为两类:
(1) standalone : 请求来自于客户端浏览器;
(2) 由其它的web server反代:来自前端的反代服务器;
nginx –> http connector –> tomcat
httpd(proxy_http_module) –> http connector –> tomcat
httpd(proxy_ajp_module) –> ajp connector –> tomcat
属性:
port=”8080″
protocol=”HTTP/1.1″
connectionTimeout=”20000″
address:监听的IP地址;默认为本机所有可用地址;
maxThreads:最大并发连接数,默认为200;
enableLookups:是否启用DNS查询功能;
acceptCount:等待队列的最大长度;
【 Engine组件 】:Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost来定义默认的虚拟主机;
常用属性:
name:engine组件的名称,用于日志和错误信息记录时区别不同的引擎
defaultHost=”localhost”
jvmRoute=
【Host组件 】:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机。
示例:
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”>
</Host>
常用属性说明:
(1) appBase:此Host的webapps的默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径;
(2) autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat;
示例:
<Host name=”tc1.magedu.com” appBase=”/appdata/webapps” unpackWARs=”true” autoDeploy=”true”>
</Host>
【 Context组件 】:
示例:
<Context path=”/PATH” docBase=”/PATH/TO/SOMEDIR” reloadable=””/>
【Valve组件 】:
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log” suffix=”.txt”
pattern=”%h %l %u %t "%r" %s %b” />
Valve存在多种类型:
定义访问日志:org.apache.catalina.valves.AccessLogValve
定义访问控制:org.apache.catalina.valves.RemoteAddrValve
<Valve className=”org.apache.catalina.valves.RemoteAddrValve” deny=”172\.16\.100\.67″/>
tomcat (ง •̀_•́)ง
1、nginx实现tomcat反代(LNMT)
反代服务器:nginx (node1)
tomcat1主机:192.168.1.26 (nod2)
tomcat2主机:192.168.1.31 (node3)
注意:三台服务器的时间要同步
配置tomcat主机
【node2】
# yum install jdk-8u25-linux-x86.rpm # ls /usr/java # vim /etc/profile.d/java.sh export JAVA_HOME=/USR/JAVA/LATEST export PATH=$JAVA_HOME/bin:$PATH # . /etc/profile.d/java.sh # tar xf apach-tomcat-8.5.23.tar.gz # cd /usr/local # ln -sv apach-tomcat-8.5.23 tomcat # cd tomcat/ # vim /etc/profile.d/tomcat.sh export CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOMR/bin:$PATH # . /etc/profile.d/tomcat.sh 重读 # mkdir -pv /data/webapps/ROOT # cd /usr/local/tomcat/conf # vim server.xml default Host="node3.nene.com jvmRoute="TomcatA" <Host name="node2.nene.com" appBase="/data/webapps/" unpackWAPs="true" autoDeploy="true"> <Context path="" docBase="ROOT" reloadable="true"> <Valve className="org.apaen.catalina.valve.RemoteADDrValve"> </Context> </Host> # mkdir /data/logs # catalina.sh configtest 检查语法错误 # mkdir -pv /data/webapps/ROOT{lib,classes,META-INF,WEB-INF} # vim /data/webapps/ROOT/index.jsp
<%@ page language=”java” %> <html> <head><title>TomcatA</title></head> <body> <h1><font color=”blue”>TomcatA.nene.com</font></h1> <table align=”centre” border=”1″> <tr> <td>Session ID</td> <% session.setAttribute(“nene.com”,”nene.com”); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
# catalina.sh start 测试:http://192.168.1.26:8080/ROOT # scp -rp /data node3:/data # scp server.xml node3:/usr/local/tomcat/conf 【node3】 # vim server.xml default Host="node3.nene.com jvmRoute="TomcatB" <Host name = node3.nene.com # vim /data/webapps/ROOT/index.jsp <%@ page language=”java” %> <html> <head><title>TomcatB</title></head> <body> <h1><font color=”blue”>TomcatB.nene.com</font></h1> <table align=”centre” border=”1″> <tr> <td>Session ID</td> <% session.setAttribute(“nene.com”,”nene.com”); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> # canalina.sh start 测试:http://192.168.1.26:8080/ROOT
【node1】
# yum install nginx -y # cd /etc/nginx # vim nginx.conf 先备份再编辑 upstream tcsrvs { server node2:8080; server node3:8080; } server { location ~*\.(jsp|do)$ { proxy_pass http://tcsrvs; } } # nginx -t # systemctl start nginx.service http://192.168.1.35/index.jsp 测试看是否负载均衡至后端主机 会话绑定 【node1】 # vim nginx.conf upstream tcsrvs { ip_hash } # systemctl reload nginx.service http://192.168.1.35/index.jsp 测试看是否会话绑定至后端主机 2、实现httpd(proxy_http_module)+tomcat cluster架构 httpd服务器利用proxy_http_module模块实现反代服务
利用上面的tomcat1和tomcat2服务器,里面的配置不用变
主要需要改反代服务器,停止nginx服务器,然后利用httpd实现反代服务
注意:要利用这种架构实现反代tomcat服务,要确保httpd服务器内已经加载了proxy_http_module模块:使用命令:httpd -M查看
【node1】
# yum -y install httpd
# cd /etc/httpd
# vim conf/http.conf
# DocumentRoot “/var/www/html”
# vim conf.d/vhost.conf
<VirtualHost *:80> ServerName www.nene.com ProxyRequests Off 关闭正向代理 ProxyVia On ProxyPreserveHost On 是否把用户请求使用的主机名发到后端 <Proxy *> proxy功能允许那些访问 Require all granted </Proxy>
<proxy balancer://lbcluster1> BalancerMember http://192.168.1.26:8080 loadfactor=10 route=TomcatA BalancerMember http://192.168.1.31:8080 loadfactor=10 route=TomcatA ProxySet lbmethod=byrequests </Proxy>
ProxyPass / balancer://lbcluster1/ ProxyPassReverse / balancer://lbcluster1/ <Location /> Require all granted </Location> </VirtualHost>
# httpd -t # systemctl start httpd.service # ss -tnlp httpd :::80 http://192.168.1.35/index.jsp 查看是否负载均衡 实现会话绑定: # vim conf.d/vhost.conf <proxy ProxySet stickysession=ROUTEID # httpd -t # systemctl restart httpd.service http://192.168.1.35/index.jsp 查看是否会话绑定 如果上述方法无法实现,可以采取下面的方法 # vim conf.d/vhost.conf 在顶头添加以下一行
Header add Set-Cookie “ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/” env=BALANCER_ROUTE_CHANGED
# httpd -t # systemctl restart httpd.service
3、实现httpd(proxy_ajp_module)+tomcat cluster架构
httpd服务器利用proxy_ajp_module模块实现反代服务
利用上面的tomcat1和tomcat2服务器,里面的配置不用变
注意:要利用这种架构实现反代tomcat服务,要确保httpd服务器内已经加载了proxy_ajp_module模块:可以使用命令:httpd -M查看
上一例中的所有配置不变,只需修改下面一项即可 # vim conf.d/vhosta.conf <proxy balancer://lbcluster1> BalancerMember http://192.168.1.26:8080 loadfactor=10 route=TomcatA BalancerMember http://192.168.1.31:8080 loadfactor=10 route=TomcatA ProxySet lbmethod=byrequests </Proxy>
4、实现mod_jk+tomcat cluster架构
tomcat (>^ω^<)喵
session sticky
session cluster
session server
除了上面实现的会话保持以外,还有两种可以实现会话保持的方法
1、会话管理:deltaManager(session cluster)
前端node1用的mod_proxy_http
【node2】
# vim server.xml
<host
<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.1.4" 多播地址 port="45564" frequency="500" 没多久发一次心跳(毫秒) dropTime="3000"/> 多久没收到心跳将其踢出集群
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 如何接收心跳 address="192.168.1.47(192.168.1.31)" port="4000" autoBind="100" 是否自动绑定,绑定的时间 selectorTimeout="5000" 挑选的超时时间 maxThreads="6"/> 最大线程 <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 如何传递心跳 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 如何进行传输 </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</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> # Catalina.sh configtest # cp web.xml /data/webapps/ROOT/WEB-INF/ # vim /data/webapps/ROOT/WEB-INF/web.xml <distributable> # scp /data/webapps/ROOT/WEB-INF/web.xml node3: /data/webapps/ROOT/WEB-INF/ 【node2&3】 # catalina.sh start # ss –tnl # tail /usr/local/tomcat/logs/catalina.out 看有没有对方的节点 访问192.168.1.35看会话是否保持
2、memcache会话保持:memcache-session-manager (session server) 在Tomcat主机下载好MSM; memcache-session-manager-1.8.3.jar memcache-session-manager-tc8-1.8.3.jar msm-javolution-serializer-1.8.3.jar javolution-5.4.3.1 spymemcache-2.11.1.jar 下载地址:https://github.com/magro/memcached-session-manager/wiki/SetAndConfiguration
在Tomcat主机的server.xml中的context中添加以下代码; <Context path="" docBase="ROOT" reloadable=”true”> <Manager className=”de.javakaffee.web.msm.MemcachedBackupSessionManager” memcachedNodes=”n2:192.168.1.26:11211,n3:192.168.1.31:11211″ failoverNodes=”n2″ 备用节点 requestUriIgnorePattern=”.*\.(ico|png|gif|jpg|css|js)$” 转码器 transcoderFactoryClass=”de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory” 序列化工具 /> </Context> 在memcache主机上yum安装memcache; yum -y install memcache
原创文章,作者:nene,如若转载,请注明出处:http://www.178linux.com/88456