Loading... <p>前言</p> <p> tomcat介绍:</p> <p> tomcat是一个免费开放源代码的web应用服务器,不是一个完整意义上的Java EE服务器;它甚至都没有提供哪怕对一个主Java EE API的实现,但由于遵守apache开源协议,tomcat却有为众多的java应用程序服务器嵌入自己的产品中构建商业的java应用程序服务器,如JBoss和JOnAS等。tomcat工作在jdk(Java Development Kit)之上;要想使用tomcat必须先安装jdk,jdk分为open jdk和 Oracle jdk,可根据自己的需要选择相应的jdk来实现tomcat实例。</p> <p></p> <p>一、tomcat相关件介绍</p> <p>1、配置文件介绍</p> <p> sever.xml:tomcat核心配置文件;</p> <p> context.xml:每个webapp都有其配置文件,这些配置文件通常位于webapp应用程序目录下的WEB-INF目录中,用于定义会话管理器、JDBC;此配置文件为所有的webapp提供默认配置</p> <p> web.xml: 每个webapp部署之后才能被访问;此配置文件则用于为所有webapp提供默认部署方式</p> <p> tomcat-users.xml: 用于认证账号配置文件</p> <p> catalina.policy: 当使用-secruity启动tomcat实例时通过读取此配置文件来定义其安全运行策略</p> <p> catalina.properties: java属性的定义文件,用于设定类加载器路径,以及一些jvm性能调整的相关参数</p> <p> logging.properties: 日志相关的配置文件</p> <p></p> <p>2、tomcat的组件:</p> <p> <img src="//cto.wang/usr/uploads/2016/07/20160703163719-89.png" title="1437194763798383.png" alt="1.png" /></p> <p>顶级类组件:Server,代表一个tomcat实例</p> <p>服务类组件:Service,将连接器关联至内部的Engine引擎</p> <p>连接器组件:Connector,常用的有http、https、ajp(Apache JServ Protocol)</p> <p>容器类组件:Engine,代表一个web container</p> <p> 包含:host(虚拟主机)、context(主机配置文件)</p> <p>被嵌套类组件:valve,logger,realm,….</p> <p></p> <p>二、配置http代理tomcat</p> <p> 1、实验环境:</p> <p> <img src="//cto.wang/usr/uploads/2016/07/20160703163719-7.png" title="1437195507472836.png" alt="2.png" /></p> <p>tomcat主机:</p> <p> node1: 172.16.2.14/24</p> <p> node2: 172.16.2.13/24</p> <p>http主机<br /> node3: 172.16.2.12/24</p> <p>软件:</p> <p>tomcat下载地址:http://tomcat.apache.org/</p> <p>jdk下载地址(Oracle):http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html</p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703163719-86.png" title="1437196146948922.png" alt="3.png" /></p> <p></p> <p>2、安装jdk</p> <pre class="brush:bash;toolbar:false">[root@node1 tomcat]# rpm -ivh jdk-8u45-linux-x64.rpm \\jdk无依赖包,直接rpm安装即可 [root@node1 tomcat]# vim /etc/profile.d/java.sh \\声明环境变量 export JAVA_HOME=/usr/java/latest export PATH=$JAVA_HOME/bin:$PATH [root@node1 tomcat]# source /etc/profile.d/java.sh \\重新读取配置 [root@node1 tomcat]# java -version \\查看java的版本信息,若出现以下信息则表示安装jdk成功 java version "1.8.0_45" Java(TM) SE Runtime Environment (build 1.8.0_45-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)</pre> <p>node2安装jdk同node1一样,这里就不在演示了</p> <p></p> <p>3、安装tomcat</p> <pre class="brush:bash;toolbar:false">[root@node1 tomcat]# tar xf apache-tomcat-7.0.63.tar.gz -C /usr/local/ \\加压tomcat软件包 [root@node1 tomcat]# cd /usr/local/ [root@node1 local]# ln -sv apache-tomcat-7.0.63/ tomcat \\为tomcat解压后的文件创建软连接 [root@node1 local]# vim /etc/profile.d/tomcat.sh \\为tomcat声明环境变量 export CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOME/bin:$PATH root@node1 local]# source /etc/profile.d/tomcat.sh \\重新读取配置 [root@node1 local]# catalina.sh version \\查看版本信息,若出现以下信息,则证明部署tomcat成功 Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Server version: Apache Tomcat/7.0.63 Server built: Jun 30 2015 08:08:33 UTC Server number: 7.0.63.0 OS Name: Linux OS Version: 2.6.32-504.el6.x86_64 Architecture: amd64 JVM Version: 1.7.0_65-mockbuild_2014_07_16_06_06-b00 JVM Vendor: Oracle Corporation</pre> <p>node2节点安装tomcat跟node1节点一样,这里不在介绍</p> <p></p> <p>3.1 启动tomcat访问测试(tomcat默认http协议监听在8080端口,ajp协议监听在8009端口)</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# catalina.sh start; ssh node2 'catalina.sh start'</pre> <p>访问测试:</p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703163719-71.png" title="1437200146101210.png" alt="5.png" /></p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703163720-62.png" title="1437200161757468.png" alt="4.png" /></p> <p>3.2 添加虚拟主机:</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# cd /usr/local/tomcat/ [root@node1 tomcat]# vim conf/server.xml 在server------>service--------->engine中定义 <Host name="www.mylinux.com" appBase="/mylinux" \\在Host中定义主机名、根目录位置 unpackWARs="true" autoDeploy="true"> <context path="" doc="ROOT" reloadable="true" /> \\定义虚拟路径,此处为空即没有指定,文档目录 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="mylinux_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> \\定义虚拟主机的日志信息 </Host> <Engine name="Catalina" defaultHost="www.mylinux.com" >\\再此出将默认虚拟主机更改为自己定义的主机 [root@node1 tomcat]# mkdir -pv /mylinux/ROOT/{lib,classes,WEB-INF}\\创建tomcat所需要的目录 [root@node1 tomcat]# vim /mylinux/ROOT/index.jsp \\添加默认文档,内容如下: <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA.magedu.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("magedu.com","magedu.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html></pre> <p>重新启动tomcat,访问测试:</p> <pre class="brush:bash;toolbar:false">[root@node1 tomcat]# catalina.sh configtest \\检查配置文件是否有语法错误 [root@node1 tomcat]# catalina.sh stop \\停止tomcat [root@node1 tomcat]# catalina.sh start \\启动tomcat</pre> <p>访问测试:</p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703163720-77.png" title="1437201827949175.png" alt="6.png" /></p> <p>3.3 修改node2节点跟node1节点一样,默认页面内容如下:</p> <pre class="brush:bash;toolbar:false"><%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB.magedu.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("magedu.com","magedu.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html></pre> <p></p> <p>访问测试:</p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703163720-76.png" title="1437206898136045.png" alt="10.png" /></p> <p>4、配置使用mod_http负载均衡tomcat</p> <p>4.1安装httpd</p> <pre class="brush:bash;toolbar:false">[root@node3 ~]# yum -y install httpd \\直接使用yum安装即可 [root@node3 ~]# httpd -M \\确保httpd中含有以下proxy模块 proxy_module (shared) proxy_balancer_module (shared) proxy_ftp_module (shared) proxy_http_module (shared) proxy_ajp_module (shared) proxy_connect_module (shared)</pre> <p>4.2 启动httpd,访问测试</p> <pre class="brush:bash;toolbar:false">[root@node3 httpd]# /etc/init.d/httpd start</pre> <p>访问:</p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703163720-42.png" title="1437206153379923.png" alt="8.png" /></p> <p>4.3 修改httpd配置文件,内容如下</p> <pre class="brush:bash;toolbar:false">[root@node3 ~]# vim /etc/httpd/conf/httpd.conf #DocumentRoot "/var/www/html" \\将此行注释掉,使用虚拟主机实现 [root@node3 ~]# cd /etc/httpd/ [root@node3 httpd]# vim conf.d/mod_http.conf <Proxy balancer://cluster> \\定义集群名称 BalancerMember http://172.16.2.14:8080 loadfactor=1\\添加集群节点,loadfactor代表权重 BalancerMember http://172.16.2.13:8080 loadfactor=1 ProxySet lbmethod=byrequests \\负载均衡的调度方法 </Proxy> NameVirtualHost *:80 \\启用虚拟主机 <VirtualHost *:80> ServerName www.test.com ProxyVia On \\添加via信息 ProxyRequests off \\关闭正向代理 ProxyPreserveHost on \\支持虚拟合租记 ProxyPass / balancer://cluster stickysession=JESSIONID \\将httpd请求至后端主机 ProxyPassReverse / balancer://cluster stickysession=JESSIONID\\将httpd请求至后端主机 </VirtualHost></pre> <p>上述参数解释:</p> <table> <tbody> <tr class="firstRow"> <td width="386" valign="top"> <p></p> <p></p> <p>ProxyPass {On|Off|Full|Block}</p> </td> <td width="386" valign="top">用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为off,即不启用此功能,On表示每个请求和响应报文均添加Via:, Full表示每个Via:行都会添加当前Apache服务器版本号信息;Block表示每个代理请求中的Via:都会被移除</td> </tr> <tr> <td width="386" valign="top"> <p></p> <p>ProxyRequests {On|Off}</p> </td> <td width="386" valign="top">是否开启Apache正向代理功能;启用此项时是为了代理http协议必须启用mod_proxy_http模块。同时,如果为Apache设置了proxypass,则必须将ProxyRequests设置为Off</td> </tr> <tr> <td width="386" valign="top"> <p></p> <p>ProxyPreserveHost {On|Off}</p> </td> <td width="386" valign="top">如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无须打开此功能</td> </tr> <tr> <td width="386" valign="top"> <p></p> <p></p> <p>ProxyPass [path] !|url [key=value key=value ..]</p> </td> <td width="386" valign="top"> <p>将后端服务器某URL与当前服务器的某虚拟路径关联起来做为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某url路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。</p> </td> </tr> <tr> <td valign="top" rowspan="1" colspan="2"> <p>mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保持至连接池中已备进一步使用。连接池大或其他设定可以通过在ProxyPass中使用key=value的方式定义。也可以使用PassSet定义。常用的key如下所示:</p> </td> </tr> <tr> <td width="386" valign="top">min</td> <td width="386" valign="top">连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小</td> </tr> <tr> <td width="386" valign="top"> <p></p> <p>max</p> </td> <td width="386" valign="top">连接池的最大容量,每个MPM都有自己独立的容量;其值与MPM本身无关,如prefork的总是为1,而其他的则取决于TheradsPerChild指令的值</td> </tr> <tr> <td width="386" valign="top">loadfactor</td> <td width="386" valign="top">用于负载均衡集群配置中,定义对后端服务器的权重,取值范围为1-100</td> </tr> <tr> <td valign="top" colspan="1" rowspan="1">retry</td> <td valign="top" colspan="1" rowspan="1">当apache将请求发送至后端服务器得到错误响应时等待多次时间以后再重试。单位是秒钟</td> </tr> <tr> <td valign="top" colspan="2" rowspan="1">如果proxy指定的是balacner://开头,即用与负载均衡时,其还可以接受一些特殊的参数,如下所示:</td> </tr> <tr> <td valign="top" colspan="1" rowspan="1"> <p></p> <p>lbmethod</p> </td> <td valign="top" colspan="1" rowspan="1">apache实现负载均衡的调度算法,默认为byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载均衡进行调度</td> </tr> <tr> <td valign="top" colspan="1" rowspan="1">maxattempts</td> <td valign="top" colspan="1" rowspan="1">放弃请求之前实现故障转移的次数,默认为1,其最大值不应大于总结点数</td> </tr> <tr> <td valign="top" colspan="1" rowspan="1"> <p></p> <p>nofailover</p> </td> <td valign="top" colspan="1" rowspan="1">取值为On或Off,设置On时表示后端服务器故障时,用户的session将损坏;因此在后端服务器不支持session复制时可将其设置为On</td> </tr> <tr> <td valign="top" colspan="1" rowspan="1">stickysession</td> <td valign="top" colspan="1" rowspan="1">调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID</td> </tr> </tbody> </table> <p></p> <p>4.4 重新启动httpd,访问测试</p> <pre class="brush:bash;toolbar:false">[root@node3 httpd]# httpd -t \\测试配置文件语法错误 [root@node3 httpd]# /etc/init.d/httpd restart \\重启启动httpd</pre> <p>访问测试:</p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703163720-21.png" title="1437206284133006.png" alt="9.png" /> <img src="//cto.wang/usr/uploads/2016/07/20160703163720-69.png" title="1437207465138682.png" alt="11.png" /></p> <p></p> <p>5、使用mod_ajp实现tomcat负载均衡:</p> <p>5.1修改httpd配置文件如下:</p> <pre class="brush:bash;toolbar:false">[root@node3 conf.d]# vim mod_ajp.conf <Proxy balancer://cluster> BalancerMember ajp://172.16.2.14:8009 loadfactor=1 \\修改使用ajp协议 BalancerMember ajp://172.16.2.13:8009 loadfactor=1 \\修改使用ajp协议 ProxySet lbmethod=byrequests </Proxy> NameVirtualHost *:80 <VirtualHost *:80> servername www.test.com ProxyVia On ProxyRequests off ProxyPreserveHost on ProxyPass / balancer://cluster stickysession=JESSIONID ProxyPassReverse / balancer://cluster stickysession=JESSIONID </VirtualHost></pre> <p>5.2 重启httpd,访问测试</p> <pre class="brush:bash;toolbar:false">[root@node3 conf.d]# httpd -t [root@node3 conf.d]# /etc/init.d/httpd restart</pre> <p>访问测试:</p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703163720-53.png" title="1437207228247607.png" alt="12.png" /> <img src="//cto.wang/usr/uploads/2016/07/20160703163720-82.png" title="1437207233358168.png" alt="13.png" /></p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信