接博客nginx或httpd实现反向代理tomcat并实现会话保持(二)
实例四:使用httpd负载均衡后端tomcat服务
第一步:准备两个tomcat服务器节172.16.240.203
修改tomcat的server.xml配置文件,添加一个host。
<Host name="tomcatA.com"appBase="/myweb/webapp/" unpackWARS="TRUE"autoDeploy="no">
<Contextpath="webapp" docBase="Root" reloadable="true"/>
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="/myweb/logs"
prefix="myweb_access_log." suffix=".txt"
pattern="%h %l %u %t"%r" %s %b" />
</Host>
在修改其默认engine
<Engine name="Catalina"defaultHost="tomcatA.com" jvmRoute="tomcatA">
然后在为其提供测试文件
[root@lpw4 webapp]# cat Root/index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.lpw.com</font></h1>
<table border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("lpw.com","lpw.com");%>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
启动tomcat服务,并在浏览器中测试:
第一个节点准备完毕
修改tomcat的配置文件server.xml,添加一个host
<Host name="tomcatB.lpw.com"appBase="/myweb/webapp/" unpackWARS="TRUE"autoDeploy="no">
<Contextpath="webapp" docBase="Root" reloadable="true"/>
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="/myweb/logs"
prefix="myweb_access_log." suffix=".txt"
pattern="%h %l %u %t"%r" %s %b" />
</Host>
并修改其默认的engine:
<Engine name="Catalina"defaultHost="tomcatB.lpw.com" jvmRouter="tomcatB"
为此节点准备测试页面:
启动tomcat并在浏览器中测试:
两个节点准备完毕。
接下来配置httpd的负载均衡
使用httpd与后端tomcat链接的有三种方式:
1、 基于mod_httpd模块(使用http协议)与后端tomcat实现负载均衡;
2、 基于mod_ajp模块(使用ajp协议)与后端tomcat实现负载均衡;
3、 基于mod_jk模块(使用ajp协议)与后端tomcat实现负载均衡;
每一种方案使用的模块:
(1) apache:
mod_proxy
mod_proxy_http
mod_proxy_balancer
tomcat:
http connector
(2) apache:
mod_proxy
mod_proxy_ajp
mod_proxy_balancer
tomcat:
ajp connector
(3) apache:
mod_jk #mod_jk自身就有负载均衡的功能,因此不需要mod_balancer模块
tomcat:
ajp connector
第一种方案:基于module_httpd模块实现负载均衡
修改虚拟主机的配置文件:
<proxy balancer://lbcluster1>
BalancerMember http://172.16.249.203:8080 loadfactor=1 route=tomcatA
BalancerMember http://172.16.249.204:8080 loadfactor=1 route=tomcatB
</proxy>
<VirtualHost *:80>
ServerName tomcat.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<proxy *>
Require all granted
</proxy>
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
然后重启httpd服务,并在浏览器中测试:
要实现session绑定,只需修改虚拟主机的配置文件:
Header add Set-Cookie"ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/"env=BALANCER_ROUTE_CHANGED
<proxy balancer://lbcluster1>
BalancerMember http://172.16.249.203:8080 loadfactor=1 route=tomcatA
BalancerMember http://172.16.249.204:8080 loadfactor=1 route=tomcatB
ProxySet stickysession=ROUTEID
</proxy>
<VirtualHost *:80>
ServerName tomcat.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<proxy *>
Require all granted
</proxy>
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
重启httpd服务,并用浏览器测试:
第二种方法:基于mod_ajp实现负载均衡tomcat:
修改虚拟主机的配置文件如下
<proxy balancer://lbcluster1>
BalancerMember ajp://172.16.249.203:8009 loadfactor=1 route=tomcatA
BalancerMember ajp://172.16.249.204:8009 loadfactor=1 route=tomcatB
</proxy>
<VirtualHost *:80>
ServerName tomcat.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<proxy *>
Require all granted
</proxy>
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
在浏览器中测试:
要实现session,修改虚拟主机配置文件如下,
#Header add Set-Cookie"ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/"env=BALANCER_ROUTE_CHANGED
<proxy balancer://lbcluster1>
BalancerMember ajp://172.16.249.203:8009 loadfactor=1 route=tomcatA
BalancerMember ajp://172.16.249.204:8009 loadfactor=1 route=tomcatB
# ProxySet stickysession=ROUTEID
</proxy>
<VirtualHost *:80>
ServerName tomcat.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<proxy *>
Require all granted
</proxy>
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
重启httpd服务,并使用浏览器测试:
注意:以上两种方法都是使用proxy_balancer_module模块实现的负载均衡,此模块也自带了内置的后端各节点主机管理页面,因此,此页面也需要做访问控制,在虚拟主机配置文件中启用此功能。添加如下Location段。
<Location /balancer-manager> #balancer-manager是自定义的网页访问时的页面名称
SetHandlerbalancer-manager #此项指明内置的管理器为balancer-manager,这是内置的固定格式。
Proxypass! #感叹号表示在做负载均衡时请求的资源是balancer-manager页面的时候不想后端节点做负载均衡。
require ip 172.16.1.104 #指明访问控制的允许访问的主机ip地址
require all denied #指明此页面拒绝其他用户访问。此页面也可以使用基于用户的访问控制。
</Location>
或者基于用户的访问控制:配置如下:
基于ip地址的访问控制测试:
在其他主机上使用curl命令来访问此页面
基于用户访问控制测试:
第三种方法:使用mod_jk实现负载均衡后端tomcat
这里首先配置mod_jk模块实现反向代理后端tomcat:
mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。
mok_jk模块实现与后端tomcat做负载均衡也是基于ajp协议的,因为mod_jk模块已经不在是httpd服务的自带模块,因此要使用mod_jk模块实现,必须手动编译mod_jk模块为httpd的模块才可使用。
首先解压tomcat-connectors软件包:
[root@lpw3 src]# tar -xftomcat-connectors-1.2.40-src.tar.gz -C /usr/local/
[root@lpw3 local]# cdtomcat-connectors-1.2.40-src/
[root@lpw3 tomcat-connectors-1.2.40-src]#cd native/
要编译mod_jk为httpd的模块,需要指定—with-apxs选项,表示将mod_jk模块编译为httpd的模块,这里使用的是httpd-2.4,支持动态装载模块,因此只要编译mod_jk就可以直接让httpd加载,所有首先确认是否有apxs工具,如:
而apxs是由http-devel包提供,因此安装http-devel包即可。(需要安装开发包和开发工具)
[root@lpw3 native]# yum install http-devel
在native目录下执行./configure
[root@lpw3 native]# ./configure --with-apxs
[root@lpw3 native]# make && makeinstall
然后在httpd的配置文件中装载此模块:
安装完成后可httpd的模块目录下查看是否有此模块:
此模块安装后不会自动被httpd装载,需要手动装载,为此模块创建一个独立配置文件:
[root@lpw3 conf.d]# vim http-jk.conf
LoadModule jk_module modules/mod_jk.so #加载mod_jk模块
JkWorkersFile /etc/httpd/conf.d/workers.properties #指明mod_jk模块使用的配置worker属性的文件,此文件需要自己创建
JkLogFile logs/mod_jk.log #开启日志功能
JkLogLevel debug #开启调试功能
JkMount /* TomcatA #指明将所有的请求资源都代理至后端tomcaA来处理
JkMount /status/ stat1 #stat1是jk模块内置的一个worker,用来显示status管理页面信息的,此页面不应该让管理员以外的人查看,因此需要做访问控制。
然后创建workers.properties文件
[root@lpw3 conf.d]# vim workers.properties
worker.list=TomcatA,stat1 #指明worker名单列表,这里一个是TomcatA,后端的tomcat服务器,一个是stat1,是jk模块内置的一个worker。
worker.TomcatA.port=8009 #指明后端tomcat的端口
worker.TomcatA.host=172.16.249.204 #指明后端tomcat的ip地址
worker.TomcatA.type=ajp13 #指明基于ajp-1.3协议与后端tomcat进行连接
worker.TomcatA.lbfactor=1 #指明负载均衡时后端tomcatA主机的权重,(mo_jk做负载均衡时此项必须给出一个值,只做反向代理的情况下可以不指定此项)
worker.stat1.type = status #指明stat1这个worker的类型,可以认为此项是默认的写法。
[root@lpw3 conf.d]# httpd -t
Syntax OK
[root@lpw3 conf.d]# systemctl reloadhttpd.service
在浏览器中查看:
由于status页面不应该让所有人都能访问,因此要对此页面做访问控制:
修改http-jk.conf配置文件,在其中添加访问控制:
<Location /status> #定义对status页面做访问控制
require ip 172.16.1.104 #定义只允许172.16.249.104访问此页面
require all denied #拒绝所有的主机访问
</Location>
然后检查httpd的配置文件是否有错误,重新载入配置文件,并在另一主机上使用curl命令访问此页面:
[root@lpw3 conf.d]# vim http-jk.conf
[root@lpw3 conf.d]# httpd -t
Syntax OK
[root@lpw3 conf.d]# systemctl reloadhttpd.service
[root@lpw3 conf.d]# curl http://172.16.249.208/status/ #这里使用虚拟机的curl命令模拟访问status页面。
然后开始配置使用mod_jk模块实现负载均衡后端tomcat服务器:
编辑http-jk.conf配置文件:
[root@lpw3 conf.d]# vim http-jk.conf
LoadModule jk_module modules/mod_jk.so #加载mod_jk模块
JkWorkersFile /etc/httpd/conf.d/workers.properties #定义mok_jk模块用来定义个work属性的配置文件,负载均衡的后端主机的配置都在此文件中,需要手动编辑。
JkLogFile logs/mod_jk.log #开启日志功能
JkLogLevel debug #开启调试功能
JkMount /* lbcluster1 #定义所有请求使用负载均衡调度
JkMount /status/ stat1 #定义status页面
然后编辑workers.properties文件
worker.list = lbcluster1,stat1 #定义worker列表,第一个为负载均衡worker名,第二个是内置的stat1的worker。
worker.TomcatA.type = ajp13 #定义负载均衡的一个节点node为TomcatA,指明使用的协议为ajp1.3版本
worker.TomcatA.host = 172.16.249.203 #定义TomcatA的ip地址
worker.TomcatA.port = 8009 #指明TomcatA 监听的端口
worker.TomcatA.lbfactor = 1 #指明TomcataA的权重为1
worker.TomcatB.type = ajp13 #定义负载均衡的一个节点node为TomcatB,指明使用的协议为ajp1.3版本.
worker.TomcatB.host = 172.16.249.204 #定义TomcatB的ip地址
worker.TomcatB.port = 8009 #指明TomcatB 监听的端口
worker.TomcatB.lbfactor = 1 #指明TomcataB的权重为1
worker.lbcluster1.type = lb #指明lbcluster1这个worker的类型是lb(表示负载均衡),此项是定义负载均衡的关键。
worker.lbcluster1.sticky_session = 0 #指明是否开启session绑定机制,0表示不开启,1表示开启,如果后端是session集群的情况下,可以不开启此功能。
worker.lbcluster1.balance_workers =TomcatA, TomcatB #定义负载均衡的两个节点。
worker.stat1.type = status #stat1是jk模块内置的一个worker,用来显示status管理页面信息的,此页面不应该让管理员以外的人查看,因此需要做访问控制。
然后检查httpd配置文件的语法,并重新载入配置文件,在浏览器中测试:
要想实现session绑定只需修改worker.lbcluster1.sticky_session = 1即可
实例五:使用nginx做负载均衡后端tomcat服务器,只需要将前端调度器使用nginx实现:
编辑nginx的配置文件:
upstream upserver{
server 172.16.249.203:8080 weight=1;
server 172.16.249.204:8080 weight=1;
}
server {
listen 80;
location ~* \.(jsp|do)$ {
proxy_pass http://upserver;
}
}
使用浏览器测试:
要实现session绑定功能,只需要再nginx的配置文件中添加调度算法,基于ip_hash算法。
即可实现基session绑定机制。
注意:一个tomcat实例最大占据内存为32G,因此在一个性能良好的服务器上,可以同时启动多个tomcat实例(只要使用不同的端口),即可提高服务器的利用率!
后续实例见博客四:tomcat实现session集群及tomcat+memcached共享session服务器实现会话保持