接博客nginx或httpd实现反向代理tomcat并实现会话保持(二)

实例四:使用httpd负载均衡后端tomcat服务

wKioL1Y45quT6gudAADEdpNMnCM984.jpg

 

第一步:准备两个tomcat服务器节172.16.240.203

  修改tomcatserver.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&quot;%r&quot; %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服务,并在浏览器中测试:

wKiom1Y45o3gYvHoAAEijhkeVyY413.jpg

第一个节点准备完毕

修改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&quot;%r&quot; %s %b" />

 

       </Host>

并修改其默认的engine

<Engine name="Catalina"defaultHost="tomcatB.lpw.com" jvmRouter="tomcatB"

为此节点准备测试页面:

启动tomcat并在浏览器中测试:

wKioL1Y45uKBJ4NGAAENJG-yWz0726.jpg

两个节点准备完毕。

接下来配置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/

       ProxyPa***everse / balancer://lbcluster1/

       <Location />

                Require all granted

       </Location>

</VirtualHost>

然后重启httpd服务,并在浏览器中测试:

wKioL1Y45xjCtBgTAAEDGywbMHM380.jpg

wKiom1Y45trjxUc3AAEPS5mIbbU421.jpg


要实现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/

       ProxyPa***everse / balancer://lbcluster1/

       <Location />

                Require all granted

       </Location>

</VirtualHost>

重启httpd服务,并用浏览器测试:

wKiom1Y45vmC1ilZAAEMuItajyU434.jpg

第二种方法:基于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/

       ProxyPa***everse / balancer://lbcluster1/

       <Location />

                Require all granted

       </Location>

</VirtualHost>

在浏览器中测试:

wKioL1Y453vyNegVAAE1Re8MOWs036.jpg

wKiom1Y45z6C8PYVAAETjMegxNs464.jpg

要实现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/

       ProxyPa***everse / balancer://lbcluster1/

       <Location />

                Require all granted

       </Location>

</VirtualHost>

重启httpd服务,并使用浏览器测试:

wKioL1Y455azkEnxAAEZdlJRp6o024.jpg

注意:以上两种方法都是使用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>

wKiom1Y452-AJ2MBAAC3F1oihiw433.jpg

或者基于用户的访问控制:配置如下:


wKiom1Y4572DbJaFAADSLo8EnJM493.jpg

wKioL1Y45_rBAsCwAAD26JS9d3I325.jpg

基于ip地址的访问控制测试:

wKiom1Y459WinMLJAAPM9AF9fwo961.jpg

在其他主机上使用curl命令来访问此页面

wKioL1Y46CnxYBvYAAGb1F0Ng0M708.jpg

基于用户访问控制测试:


wKiom1Y46A3iV_0ZAAE1fdSY0BI144.jpg

wKioL1Y46EzTnlhTAANxbMOrA8Y367.jpg

 

第三种方法:使用mod_jk实现负载均衡后端tomcat

这里首先配置mod_jk模块实现反向代理后端tomcat

mod_jkASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是TomcatAJP连接器)。

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_jkhttpd的模块,需要指定—with-apxs选项,表示将mod_jk模块编译为httpd的模块,这里使用的是httpd-2.4,支持动态装载模块,因此只要编译mod_jk就可以直接让httpd加载,所有首先确认是否有apxs工具,如:

wKiom1Y466vj41zCAADJs2hjI4w217.jpg

apxs是由http-devel包提供,因此安装http-devel包即可。(需要安装开发包和开发工具)

[root@lpw3 native]# yum install http-devel

wKioL1Y47AOQw2FOAAFFqEk-I9M203.jpg

native目录下执行./configure

[root@lpw3 native]# ./configure --with-apxs

wKiom1Y469-QRBUbAAFottfZ00w818.jpg

[root@lpw3 native]# make && makeinstall

然后在httpd的配置文件中装载此模块:

安装完成后可httpd的模块目录下查看是否有此模块:

wKiom1Y47AHTLrAQAAB30uJJFVY489.jpg

wKiom1Y47AGBtzusAABycsC17cs233.jpg

此模块安装后不会自动被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  #stat1jk模块内置的一个worker,用来显示status管理页面信息的,此页面不应该让管理员以外的人查看,因此需要做访问控制。

wKioL1Y47FWDn5cOAAEN1dACQS8937.jpg

然后创建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 #指明后端tomcatip地址

worker.TomcatA.type=ajp13  #指明基于ajp-1.3协议与后端tomcat进行连接

worker.TomcatA.lbfactor=1  #指明负载均衡时后端tomcatA主机的权重,(mo_jk做负载均衡时此项必须给出一个值,只做反向代理的情况下可以不指定此项)

worker.stat1.type = status #指明stat1这个worker的类型,可以认为此项是默认的写法。

wKiom1Y47DGCfX2yAADmoQheEjc131.jpg

[root@lpw3 conf.d]# httpd -t

Syntax OK

[root@lpw3 conf.d]# systemctl reloadhttpd.service

在浏览器中查看:

wKioL1Y47JDgBlORAAEjLTINPh0132.jpg

wKiom1Y47FOidUF4AAJLSOcDsTY686.jpg

由于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页面。

wKioL1Y47KiDVeU8AAFyuibXtpo754.jpg

 

然后开始配置使用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页面

wKiom1Y47H_ilmf4AAEOXvQfpsI234.jpg

然后编辑workers.properties文件

worker.list = lbcluster1,stat1 #定义worker列表,第一个为负载均衡worker名,第二个是内置的stat1worker

worker.TomcatA.type = ajp13 #定义负载均衡的一个节点nodeTomcatA,指明使用的协议为ajp1.3版本

worker.TomcatA.host = 172.16.249.203 #定义TomcatAip地址

worker.TomcatA.port = 8009  #指明TomcatA 监听的端口

worker.TomcatA.lbfactor = 1 #指明TomcataA的权重为1

worker.TomcatB.type = ajp13 #定义负载均衡的一个节点nodeTomcatB,指明使用的协议为ajp1.3版本.

worker.TomcatB.host = 172.16.249.204  #定义TomcatBip地址

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 #stat1jk模块内置的一个worker,用来显示status管理页面信息的,此页面不应该让管理员以外的人查看,因此需要做访问控制。

wKiom1Y47Juh785cAAHttTBDrhA277.jpg

然后检查httpd配置文件的语法,并重新载入配置文件,在浏览器中测试:

 

wKioL1Y47QbgFOjcAACu37IjlI4010.jpg

wKiom1Y47MniKhJTAAERVUTx8P4996.jpg

wKioL1Y47QiQL1AAAAEPsIpW_G0850.jpg

要想实现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;

       }

}

使用浏览器测试:

wKiom1Y47PbS9xI2AAELD5SLqew441.jpg

wKioL1Y47TSQHxfFAAEUK-Ig9Bg775.jpg

要实现session绑定功能,只需要再nginx的配置文件中添加调度算法,基于ip_hash算法。

wKiom1Y47QeR5V5PAACrKHMhL5s695.jpg

即可实现基session绑定机制。

 

注意:一个tomcat实例最大占据内存为32G,因此在一个性能良好的服务器上,可以同时启动多个tomcat实例(只要使用不同的端口),即可提高服务器的利用率!


后续实例见博客四:tomcat实现session集群及tomcat+memcached共享session服务器实现会话保持