Tomcat一步步实现反向代理、负载均衡、内存复制
Tomcat是一个开源的Java EE服务器,想弄明白其中原理还有很长路要走,但是对于有Apache,Nginx经验的我们来说部署它还是没有问题的,下面我们来一步步的构建这些基本的功能吧。实验环境:rhel 5.8,SElinux已经关闭一.构建一个基本的Tomcat服务器不需要额外服务器配合,自己可以直接响应请求。规划:172.16.1.22.c...
Tomcat是一个开源的Java EE服务器,想弄明白其中原理还有很长路要走,但是对于有Apache,Nginx经验的我们来说部署它还是没有问题的,下面我们来一步步的构建这些基本的功能吧。
实验环境:rhel 5.8,SElinux已经关闭
一.构建一个基本的Tomcat服务器
不需要额外服务器配合,自己可以直接响应请求。
规划:
- 172.16.1.22 .cat.laoguang.me
1.1 下载安装jdk
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7u9-downloads-1859576.html 选择适合你的平台
- rpm -ivh jdk-7u9-linux-i586.rpm ##默认安装在/usr/java中
1.2 声明JAVA_HOME变量,并为了使用方便将生成的命令加入PATH中
- vi /etc/profile.d/java.sh
- JAVA_HOME=/usr/java/latest
- PATH=$PATH:/usr/java/lastest/bin
- export JAVA_HOME PATH
- source /etc/profile.d/java.sh ##加载刚才的配置
- java -version ##显示版本号代表成功
1.3 下载安装tomcat
- tar xvf apache-tomcat-7.0.33.tar.gz -C /usr/local/
- cd /usr/local/
- ln -sv apache-tomcat-7.0.33/ tomcat ##创建软链接
1.4 声明CATALINA_HOME环境变量,为方便使用生成的命令加入到PATH中
- vi /etc/profile.d/tomcat.sh
- CATALINA_HOME=/usr/local/tomcat/
- PATH=$PATH:/usr/local/tomcat/bin
- export CATALINA_HOME PATH
- source /etc/profile.d/tomcat.sh ##加载刚才配置
- 测试是否生效
- catalina.sh version ##如果显示版本号则成功
1.5 查看tomcat的下的文件与目录
- bin ##命令目录
- conf ##配置文件目录
- lib ##类库
- logs ##日志
- webapps ##事例网站所在目录
- work ##编译时用到的工作目录
- 配置文件最需要注意的有:
- server.xml ##tomcat 主配置文件
- tomcat-users.xml ##认证文件,过会会讲到
- web.xml ##每个站点部署都需用到web.xml,如果站点有用站点的,没有则用这个默认的
1.6 查看示例站点下的文件与目录
- cd /usr/local/tomcat
- ls webapps/examples/
- index.html jsp servlets WEB-INF websocket
- 其它是自定义的,唯有WEB-INF是私有资源的目录,部署时用到的目录,通常是不允许他人访问的,查看下面的目录文件
- ls webapps/examples/WEB-INF/
- classes jsp jsp2 lib tags web.xml
- 需要请注意的有:
- classes ##包含所有服务器端类及当前应用程序相关的其它第三方类等
- lib ##包含JSP所用到的JAR文件;
- web.xml ##包含当前webapp的deploy描述符,定义时部署时用到的私有资源
1.7 启动comcat,查看默认站点
- catalina.sh configtest ##配置文件检测有没有语法错误
- catalina.sh start ##启动
1.8 访问测试,默认监听的是8080,这个是在server.xml中定义的
- http://172.16.1.22:8080/
- 如果能看到那只公猫,就成功了
1.9 添加认证用户,使用页面中的Server Status ,Manager Apps与Host Manager这些管理工具
- vi /usr/local/tomcat/conf/tomcat-users.xml 添加如下
- <role rolename="manager-gui"/> ##这个组是tomcat规定可以访问manager的组
- <role rolename="admin-gui"/> ##这个是访问Host Manager的组
- <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> ##你懂得
点击Server Status ,Manager Apps与Host Manager 输入账号tomcat密码tomcat查看后台的管理信息,具体表示找google吧,其中Manager中有个session,这个里面存的是个个站点的session id,一会儿讲session复制内容会用到。
二.自定义一个主机,如www.laoguang.me
2.1 建立一目录,用来存放文档
- mkdir -pv /web/apps/WEB-INF
2.2 建立一个测试页面
- vi /web/apps/index.jsp
- <%@ page language="java" %>
- <%@ page import="java.util.*" %>
- <html>
- <head>
- <title>JSP test page.</title>
- </head>
- <body>
- <% out.println("Hello,world!"); %>
- </body>
- </html>
2.3 编辑tomcat的配置文件 /usr/local/tomcat/conf/server.xml 定义虚拟主机,在默认Host上添加如下(不要添加到另外的host中哦)
- <Host name="www.laoguang.me" appBase="/web/apps"
- unpackWARs="true" autoDeploy="true">
- <Context path="" docBase="/web/apps" reloadable="true" />
- </Host>
2.4 下面简单说说server.xml中一些标签的意思,注意:server.xml区分大小写的
- <Server port="8005" shutdown="SHUTDOWN"> ##最大的容器server,端口号8005可用来管理Server
- <Service name="Catalina"> ##service开始定义,名字Catalina
- <Connector port="8080" protocol="HTTP/1.1" /> ##http连接器,看到了吧端口号8080
- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> ##ajp连接器,端口号8009
- <Engine name="Catalina" defaultHost="localhost"> ##定义引擎,与默认主机
- <Realm className="org.apache.catalina.realm.LockOutRealm"> ##关于认证的类
- <Host name="" appBase="" unpackWARs="" autoDeploy=""></Host>
- ##定义一个主机appBase主机的目录,相当于apache的DocumentRoot,upackWARs自动解压WAR包,autoDeploy自动部署
- <Context path="" docBase="" />
- ##Context 上下文,相当于apache的Aliase,path=""后面跟的是URI,docBase访问path的URI即访问的目录
- <Valve className="org.apache.catalina.valves.AccessLogValve" /> ##过滤器
2.5 测试
- catalina.sh stop ##先关闭catalina
- catalina.sh configtest ##查看有没有语法错误
- catalina.sh start ##启动tomcat会自动部署
- 更改window的hosts文件,添加解析
- 172.16.1.22 www.laoguang.me
- 访问www.laoguang.me:8080测试,如果显示hello world!就成功了
三.部署JspRun测试
或许一个简单的测试页面不能满足你的胃口,那我们部署个论坛吧
3.1 下载安装 JspRun
下载地址:http://www.jsprun.com/downloads/JspRun/6.0.0/JspRun!_6.0.0_GBK.zip
- unzip JspRun\!_6.0.0_GBK.zip
- mv upload/ /web/jsprun
3.2 编辑/usr/local/tomcat/conf/tomcat-users.xml 再添加一虚拟主机
- <Host name="jsprun.laoguang.me" appBase="/web/jsprun"
- unpackWARs="true" autoDeploy="true">
- <Context path="" docBase="/web/jsprun" />
- </Host>
3.3 编辑windows的hosts,添加解析
- 172.16.1.22 jsprun.laoguang.me
3.4 安装Mysql,因为该jsprun需要,为了简单yum 安装吧
- yum -y install mysql-server
- service mysqld start
3.5 为jsprun建立账号
- mysql
- mysql> create database jsprun;
- mysql> grant all on jsprun.* to 'jsprun'@'localhost' identified by 'redhat';
- mysql> flush privileges;
3.6 编缉jsprun的配置文件,修改mysql以下信息
- dbhost = localhost
- dbport=3306
- dbuser = jsprun
- dbpw = redhat
- dbname = jsprun
3.7 访问http://jsprun.laoguang.me:8080/install.jsp 安装
根据提示安装即可
四.apache做前端代理,基于mod_proxy模块与Tomcat连接
4.1 编译安装apache
过程见http://laoguang.blog.51cto.com/6013350/1039208
唯一的区别是在编译时额外加上
- --enable-proxy --enable-proxy-http --enable-proxy-ajp
- --enable-proxy ##启用代理
- --enable-proxy-http ##启用http代理模块
- --enable-proxy-ajp ##启用ajp代理模块
4.2 编缉/etc/httpd/httpd.conf
- vi /etc/httpd/httpd.conf
- LoadModule slotmem_shm_module modules/mod_slotmem_shm.so ##启用该模块
- #DocumentRoot "/usr/local/apache/htdocs" ##注释掉,我们启用虚拟主机
- Include /etc/httpd/extra/httpd-vhosts.conf ##我们用虚拟主机
4.3 编缉/etc/httpd/extra/httpd-vhosts.conf
- <VirtualHost *:80>
- ServerName jsprun.laoguang.me
- ProxyVia Off ##不让代理在http首部中显示
- ProxyRequests Off ##关闭正向代理
- ProxyPass / http://jsprun.laoguang.me:8080/ ##访问/则代理到jsprun中
- ProxyPa***everse / http://jsprun.laoguang.me:8080/ ##不让tomcat直接响应客端
- <Proxy *>
- Require all granted
- </Proxy>
- <Location />
- Require all granted
- </Location>
- ErrorLog "logs/laoguang-error_log"
- CustomLog "logs/laoguang-access_log" common
- </VirtualHost>
4.4 修改linux的/etc/hosts为jsprun.laoguang.me解析
- vi /etc/hosts
- 172.16.1.22 jsprun.laoguang.me jsprun
4.5 访问http://jsprun.laoguang.me测试
4.6 基于ajp协议与tomcat连接,与http的基本相同,只修改协议与端口即可,其它的一样
- ProxyPass / ajp://jsprun.laoguang.me:8009/
- ProxyPa***everse / ajp://jsprun.laoguang.me:8009/
五.apache做前端代理,基于mod_jk模块与Tomcat连接
4.1 编译安装mod_jk模块,下载地址:http://mirrors.tuna.tsinghua.edu.cn/apache//tomcat/tomcat-connectors/jk/
- tar xvf tomcat-connectors-1.2.37-src.tar.gz
- cd tomcat-connectors-1.2.37-src
- cd native/
- ./configure --with-apxs=/usr/local/apache/bin/apxs
- make && make install
4.2 apache要使用mod_jk连接器,需要在启动时加载此连接器模块。为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/extra/httpd-jk.conf来保存相关指令及其设置。其内容如下:
- vi /etc/httpd/extra/httpd-jk.conf
- # Load the mod_jk
- LoadModule jk_module modules/mod_jk.so
- JkWorkersFile /etc/httpd/extra/workers.properties
- JkLogFile logs/mod_jk.log
- #JkLogLevel debug
- JkMount /* laoguang
- JkMount /status/ status
4.3 建立mod_jk需要的配置文件
- vi /etc/httpd/extra/workers.properties
- worker.list=laoguang,status
- worker.laoguang.port=8009
- worker.laoguang.host=172.16.1.22
- worker.laoguang.type=ajp13
- worker.laoguang.lbfactor=1
- worker.status.type = status
4.4 在/etc/httpd/httpd.conf中把/etc/httpd/extra/httpd-jk.conf 包含进来,并注释掉虚拟主机,与其中的代理会冲突的哦
- vi /etc/httpd/httpd.conf
- #Include /etc/httpd/extra/httpd-vhosts.conf
- Include /etc/httpd/extra/httpd-jk.conf
- ##重启httpd
- service httpd restart
4.5 访问http://jsprun.laoguang.me/测试,能否能看到jsprun
五.基于mod_proxy构建负载均衡
为了实现负载均衡,我们增加一台服务器
- 172.16.1.21 tom.laoguang.me
5.1 安装jdk与上相同
5.2 安装tomcat与上相同
5.3.1 增加一虚拟主机,并添加engine的jvmRoute
- mkdir -pv /web/balance/WEB-INF
- vi /usr/local/tomcat/conf/server.xml
- <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA"> ##找到Engine添加
- <Host name="balance.laoguang.me" appBase="/web/balance"
- unpackWARs="true" autoDeploy="true">
- <Context path="" docBase="/web/balance" />
- </Host>
5.3.2 添加一测试页面
- vi /web/balance/index.jsp
- <%@ page language="java" %>
- <html>
- <head><title>TomcatA</title></head>
- <body>
- <h1><font color="red">TomcatA </font></h1>
- <table align="centre" border="1">
- <tr>
- <td>Session ID</td>
- <% session.setAttribute("abc","abc"); %>
- <td><%= session.getId() %></td>
- </tr>
- <tr>
- <td>Created on</td>
- <td><%= session.getCreationTime() %></td>
- </tr>
- </table>
- </body>
- </html>
5.3.2 重启catalina 声明:修改tomcat配置文件后需重启以后不再说明了
- catalina stop
- catalina start
5.3.2 添加windows的hosts解析
- 172.16.1.21 balance.laoguang.me
5.3.3 访问http://balance.laoguang.me:8080/ 查看是否成功
5.4.1 同样在原来cat服务器上也增加同样的虚拟主机,方法同上,engine的jvmroute改为TomcatB,为了方便查看修改index.jsp显示的颜色
- vi /usr/local/tomcat/conf/server.xml
- <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB"> ##找到Engine添加
- vi /web/balance/index.jsp
- <%@ page language="java" %>
- <html>
- <head><title>TomcatB</title></head>
- <body>
- <h1><font color="green">TomcatB </font></h1>
- <table align="centre" border="1">
- <tr>
- <td>Session ID</td>
- <% session.setAttribute("abc","abc"); %>
- <td><%= session.getId() %></td>
- </tr>
- <tr>
- <td>Created on</td>
- <td><%= session.getCreationTime() %></td>
- </tr>
- </table>
- </body>
- </html>
5.4.2 重启catalina
5.4.3 修改刚添加的windows的hosts测试这个主机
- 172.16.1.22 balance.laoguang.me
5.4.4 访问http://balance.laoguang.me:8080/测试
5.5.下面来配置前端apache来实现后端负载均衡
apache是在cat上安装的,注意的是基于mod_proxy的负载均衡必须在中心主机中配置
5.5.1 编缉apache配置文件/etc/httpd/httpd.conf
- vi /etc/httpd/httpd.conf
- #Include /etc/httpd/extra/httpd-jk.conf ##注释掉原来的jk
- ServerName balance.laoguang.com:80
- #DocumentRoot "/usr/local/apache/htdocs" ##不注释也可以,在下面添加
- ProxyRequests Off
- <Proxy balancer://lbcluster>
- BalancerMember ajp://172.16.1.21:8009 loadfactor=10 route=TomcatA
- BalancerMember ajp://172.16.1.22:8009 loadfactor=10 route=TomcatB
- </Proxy>
- ProxyPass / balancer://lbcluster/
- ProxyPa***everse / balancer://lbcluster/
5.5.2 重启httpd访问http://balance.laoguang.me/测试,如果页面能切换代表ok
5.6 当然也可以用http协议与tomcat连接,更改协议与端口即可
- BalancerMember http://172.16.1.21:8080 loadfactor=10 route=TomcatA
- BalancerMember httpp://172.16.1.22:8080 loadfactor=10 route=TomcatB
六.基于mod_jk实现负载均衡
6.1 注释刚才添加的基于proxy_mod的配置,启用已添加的mod_jk配置
- #ProxyRequests Off
- #<Proxy balancer://lbcluster>
- # BalancerMember ajp://172.16.1.21:8009 loadfactor=10 route=TomcatA
- # BalancerMember ajp://172.16.1.22:8009 loadfactor=10 route=TomcatB
- #</Proxy>
- #ProxyPass / balancer://lbcluster/
- #ProxyPa***everse / balancer://lbcluster/
- Include /etc/httpd/extra/httpd-jk.conf
6.2 修改 /etc/httpd/extra/httpd-jk.conf
- vi /etc/httpd/extra/httpd-jk.conf
- # Load the mod_jk
- LoadModule jk_module modules/mod_jk.so
- JkWorkersFile /etc/httpd/extra/workers.properties
- JkLogFile logs/mod_jk.log
- #JkLogLevel debug
- JkMount /* cluster1
- JkMount /status/ status
6.3 修改/etc/httpd/workers.properties
- worker.list = cluster1,status
- worker.TomcatA.type = ajp13
- worker.TomcatA.host = 172.16.1.21
- worker.TomcatA.port = 8009
- worker.TomcatA.lbfactor = 5
- worker.TomcatB.type = ajp13
- worker.TomcatB.host = 172.16.1.22
- worker.TomcatB.port = 8009
- worker.TomcatB.lbfactor = 5
- worker.cluster1.type = lb
- worker.cluster1.sticky_session = 0 ##如果为1会绑定session
- worker.cluster1.balance_workers = TomcatA, TomcatB
- worker.status.type = status
6.4 测试访问 http://balance.laoguang.me/
7.1 修改172.16.1.21的server.xml,在engine下添加如下
- vi /usr/local/tomcat/conf/server.xml
- <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="227.50.10.1" bind="172.16.1.21" port="45564"
- frequency="500" dropTime="3000"/>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
- address="172.16.1.21" 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=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
- <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.JvmRouteSessionIDBinderListener"/>
- <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
- </Cluster>
7.2 修改balance虚拟主机的部署文件web.xml
我们建立的balance时没有建立web.xml,我们继承的是/usr/local/tomcat/conf/web.xml的,我们现在需要修改部署文件,所以拷贝到/web/balance/WEB-INF中修改,在<web-app> </web-app>中添加 <distributable/>,部份如下
- cp /usr/local/tomcat/conf/web.xml /web/apps/WEB-INF/
- vi /web/apps/WEB-INF/web.xml
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- <welcome-file>index.htm</welcome-file>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <distributable/>
- </web-app>
7.3 修改172.16.1.22 的server.xml 基本与172.16.1.21的相同,只修改多播ip与接收ip即可,为了不浪费51blog的存储空间,就不完全显示了
- <Membership className="org.apache.catalina.tribes.membership.McastService"
- address="227.50.10.1" bind="172.16.1.22" port="45564"
- frequency="500" dropTime="3000"/>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
- address="172.16.1.22" port="4000" autoBind="100"
- selectorTimeout="5000" maxThreads="6"/>
7.4 对balance虚拟主机部署文件修改与172.16.1.21相同
7.5 测试访问 http://balance.laoguang.me/ 查看session id变化情况
到此构建结束,过程并不难,但要熟练使用tomcat必须得去了解java啊,还有好长的路要走,不要以为会构建了tomcat就觉的会tomcat了,其实还不到10%,所以加油,写给你们,也写给自己。
转载于:https://blog.51cto.com/laoguang/1086329
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)