apache分别基于三种方案实现tomcat的代理、负载均衡及会话绑定

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介:

apache分别基于mod_proxy_ajp, mod_proxy_http, mod_jk三种方案实现代理、负载均衡、会话绑定及Tomcat session cluster


1、nginx, haproxy, apache(mod_proxy_ajp, mod_proxy_http, mod_jk)反代用户请求至tomcat;

2、nginx, haproxy, apache(mod_proxy_ajp, mod_proxy_http, mod_jk)负载用户请求至tomcat servers;额外实现session sticky;

3、tomcat session cluster; 

4、tomcat session server(msm);


规划:

172.16.1.2   apache反代服务器

172.16.1.3   tomcat A

172.16.1.10  tomcat B


说明:

如题,可以选择使用一个去反代用户请求至tomcat,因为apache和Tomcat都是Apache 软件基金会的产品,两者有更好的兼容性,所以选择用apache,并且会以mod_proxy_ajp, mod_proxy_http, mod_jk三种方式分别实现题目要求。


1.方案一:mod_proxy_http

vim /etc/httpd/conf.d/lb_tomcat.conf 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Header add Set-Cookie  "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/"  env =BALANCER_ROUTE_CHANGED
 
<Proxy balancer: //tcsrvs >
   BalancerMember http: //172 .16.1.10:8080 /testapp  route=TomcatA loadfactor=1
   BalancerMember http: //172 .16.1.3:8080 /testapp  route=TomcatB loadfactor=2
         ProxySet lbmethod=byrequests
         ProxySet stickysession=ROUTEID
< /Proxy >
 
<VirtualHost *:80>
         ServerName      lb.zrs.com
         ProxyVia On
         ProxyRequests Off
         <Proxy *>
                 Require all granted
         < /Proxy >
         ProxyPass / balancer: //tcsrvs/
         <Location />
                 Require all granted
         < /Location >
< /VirtualHost >


分别为两个Tomcat的server.xml配置文件中的引擎中添加jvmRoute


1
2
3
4
5
第一个tomcat配置为TomcatA:
<Engine name= "Catalina"  defaultHost= "localhost"  jvmRoute= "TomcatA" >
 
第二个tomcat配置为TomcatB:
<Engine name= "Catalina"  defaultHost= "localhost"  jvmRoute= "TomcatB" >


分别为两个Tomcat Server的testapp提供测试页面:

tomcatA:

# mkdir -pv /usr/share/tomcat/webapps/testapp/{WEB-INF,classes,lib}

# vim /usr/share/tomcat/webapps/testapp/index.jsp

添加如下内容:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language= "java"  %>
<html>
   < head ><title>TomcatA< /title >< /head >
   <body>
     <h1><font color= "red" >TomcatA.zrs.com< /font >< /h1 >
     <table align= "centre"  border= "1" >
       < tr >
         <td>Session ID< /td >
     <% session.setAttribute( "zrs.com" , "zrs.com" ); %>
         <td><%= session.getId() %>< /td >
       < /tr >
       < tr >
         <td>Created on< /td >
         <td><%= session.getCreationTime() %>< /td >
      < /tr >
     < /table >
   < /body >
< /html >


tomcatB:

# mkdir -pv /usr/share/tomcat/webapps/testapp/{WEB-INF,classes,lib}

# vim /usr/share/tomcat/webapps/testapp/index.jsp

添加如下内容:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language= "java"  %>
<html>
   < head ><title>TomcatB< /title >< /head >
   <body>
     <h1><font color= "blue" >TomcatB.zrs.com< /font >< /h1 >
     <table align= "centre"  border= "1" >
       < tr >
         <td>Session ID< /td >
     <% session.setAttribute( "zrs.com" , "zrs.com" ); %>
         <td><%= session.getId() %>< /td >
       < /tr >
       < tr >
         <td>Created on< /td >
         <td><%= session.getCreationTime() %>< /td >
      < /tr >
     < /table >
   < /body >
< /html >


客户端测试,因为做了session sticky,会一直调度到后端一台服务器上,如我的一直是TomcatA

A.PNG

关掉TomcatA,便会调度到TomcatB上。

B.PNG


2.方案二:mod_proxy_ajp

使用mod_proxy_ajp,仅需要把mod_proxy_http的http改为ajp,端口8080改为8009即可,需要注意的是前端用了ajp,可以把后端的tomcat的8080端口注释掉,不让其监听,从而使安全性更高。


vim /etc/httpd/conf.d/lb_tomcat.conf 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Header add Set-Cookie  "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/"  env =BALANCER_ROUTE_CHANGED
 
<Proxy balancer: //tcsrvs >
   BalancerMember ajp: //172 .16.1.10:8009 /testapp  route=TomcatA loadfactor=1
   BalancerMember ajp: //172 .16.1.3:8009 /testapp  route=TomcatB loadfactor=2
         ProxySet lbmethod=byrequests
         ProxySet stickysession=ROUTEID
< /Proxy >
 
<VirtualHost *:80>
         ServerName      lb.qhdlink.com
         ProxyVia On
         ProxyRequests Off
         <Proxy *>
                 Require all granted
         < /Proxy >
         ProxyPass / balancer: //tcsrvs/
         <Location />
                 Require all granted
         < /Location >
< /VirtualHost >

关闭session sticky,客户端查看

ajp A.PNG

ajp B.PNG

3.方案三:mod_jk


此方案需要mod_jk模块

需要安装这个文件tomcat-connectors-VERSION.tar.gz


配置文件:

vim /etc/httpd/conf.d/mod_jk_lb.conf

1
2
3
4
5
6
LoadModule jk_module modules /mod_jk .so
JkWorkersFile  /etc/httpd/conf .d /workers .properties
JkLogFile logs /mod_jk .log
JkLogLevel debug
JkMount /* tcsrvs
JkMount  /jk-status  Stat

vim /etc/httpd/conf.d/workers.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
worker.list=tcsrvs,Stat
worker.TomcatA.host=172.16.1.10
worker.TomcatA.port=8009
worker.TomcatA. type =ajp13
worker.TomcatA.lbfactor=1
worker.TomcatB.host=172.16.1.3
worker.TomcatB.port=8009
worker.TomcatB. type =ajp13
worker.TomcatB.lbfactor=2
worker.tcsrvs. type =lb
worker.tcsrvs.balance_workers=TomcatA,TomcatB
worker.tcsrvs.sticky_session=1
worker.Stat. type =status


4.tomcat session cluster


在两个tomcat的server.xml配置启用集群

添加如下配置内容,并且注释掉8080端口

需要注意的是下面的内容中,将address="auto"的auto改为该主机的IP地址


<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.100.0.4"

port="45564"

frequency="500"

dropTime="3000"/>

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

address="auto"

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.JvmRouteSessionIDBinderListener"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>



并且在Host中添加一个Context组件

 <Host name="localhost"  appBase="webapps"

        unpackWARs="true" autoDeploy="true">

    <Context path="/test" docBase="/myapps/webapps" reloadable="true"/>


创建目录

[root@zrs tomcat]# mkdir -pv /myapps/webapps/{classes,lib,WEB-INF}


创建测试页面

跟上面的一样,创建AB两个不同的页面

[root@zrs tomcat]# vim /myapps/webapps/index.jsp


复制web.xml到指定目录

[root@zrs tomcat]# cp web.xml /myapps/webapps/WEB-INF/


编辑WEB-INF/web.xml

在任意非段落外添加<distributable/>

[root@zrs tomcat]# vim /myapps/webapps/WEB-INF/web.xml 


反代服务器配置

[root@director conf.d]# vim mod_jk_proxy.conf 


1
2
3
4
5
6
LoadModule jk_module modules /mod_jk .so
JkWorkersFile  /etc/httpd/conf .d /workers .properties
JkLogFile logs /mod_jk .log
JkLogLevel debug
JkMount /* tcsrvs
JkMount  /jk-status  Stat



[root@director conf.d]# vim workers.properties 


1
2
3
4
5
6
7
8
9
10
11
12
13
worker.list=tcsrvs,Stat
worker.TomcatA.host=172.16.1.10
worker.TomcatA.port=8009
worker.TomcatA. type =ajp13
worker.TomcatA.lbfactor=1
worker.TomcatB.host=172.16.1.3
worker.TomcatB.port=8009
worker.TomcatB. type =ajp13
worker.TomcatB.lbfactor=2
worker.tcsrvs. type =lb
worker.tcsrvs.balance_workers=TomcatA,TomcatB
worker.tcsrvs.sticky_session=0
worker.Stat. type =status

                

分别开启三台主机的httpd服务和tomcat服务


客户端测试

可以看到反代服务器以ABB的次序轮询后端两台tomcat服务器,但是ID不变,从而实现session cluster。

ID不变A.PNG

ID 不变 B.PNG

5.tomcat session server(msm)

接着刚才的配置环境,这个构建方案的原理是将所有会话放在同一台后端tomcat服务器上,当后端这台tomcat服务器宕机时,整个搭建便无法正常提供服务,所以也要给tomcat服务器做高可用。


这个构建方案需要memcached作为旁挂式缓存服务器,所以需要提前下载并启动memcached服务。


停止两台tomcat服务,还原server.xml配置文件

注释掉8080端口,在Engine中添加jvmRoute,如下


 <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA" >

 或

 <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB" >


在Host段添加配置内容


<Context path="/test" docBase="/myapps/webapps" reloadable="true">

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:172.16.1.10:11211,n2:172.16.1.3:11211"

failoverNodes="n1"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js|html|htm)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"

/>

</Context>


导入类文件

memcached-session-manager项目地址,http://code.google.com/p/memcached-session-manager/


下载如下jar文件至各tomcat节点的tomcat安装目录下的lib目录中,其中的${version}要换成你所需要的版本号,tc${6,7,8}要换成与tomcat版本相同的版本号。

memcached-session-manager-${version}.jar

memcached-session-manager-tc${6,7,8}-${version}.jar

spymemcached-${version}.jar

msm-javolution-serializer-${version}.jar

javolution-${version}.jar


将所有的类放在/usr/share/java/tomcat目录中。


启动tomcat服务即可看到反代服务器以AB的次序轮询后端两台tomcat服务器,但是session ID不变。



本文转自 Runs_ 51CTO博客,原文链接:http://blog.51cto.com/12667170/2055667,如需转载请自行联系原作者

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
应用服务中间件
tomcat重启时保持会话关闭
tomcat重启时保持会话关闭
|
网络协议 Linux 应用服务中间件
2022红帽企业版网络配置--centos7配置DHCP DNS绑定域名 FTP HTTP(apache) nginx samba
2022红帽企业版网络配置--centos7配置DHCP DNS绑定域名 FTP HTTP(apache) nginx samba
220 0
|
缓存 JavaScript 应用服务中间件
Nginx+Tomcat代理环境下JS无法完全加载问题
Nginx+Tomcat代理环境下JS无法完全加载问题
181 0
|
2月前
|
存储 JSON 物联网
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
本文我们将聚焦企业最普遍使用的 JSON 数据,分别介绍业界传统方案以及 Apache Doris 半结构化数据存储分析的三种方案,并通过图表直观展示这些方案的优势与不足。同时,结合具体应用场景,分享不同需求场景下的使用方式,帮助用户快速选择最合适的 JSON 数据存储及分析方案。
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
|
1月前
|
负载均衡 应用服务中间件 Apache
Tomcat负载均衡原理详解及配置Apache2.2.22+Tomcat7
Tomcat负载均衡原理详解及配置Apache2.2.22+Tomcat7
37 3
|
3月前
|
消息中间件 Kafka Apache
流计算引擎数据问题之Apache Kafka Streams 没有采用低水印方案如何解决
流计算引擎数据问题之Apache Kafka Streams 没有采用低水印方案如何解决
54 0
|
3月前
|
消息中间件 Kafka Apache
流计算引擎数据问题之Apache Flink 的完整性推理方案设计如何解决
流计算引擎数据问题之Apache Flink 的完整性推理方案设计如何解决
61 0
|
6月前
|
存储 缓存 负载均衡
【Apache ShenYu源码】如何实现负载均衡模块设计
整个模块为ShenYu提供了什么功能。我们可以看下上文我们提到的工厂对象。/***/核心方法很清晰,我们传入Upsteam列表,通过这个模块的负载均衡算法,负载均衡地返回其中一个对象。这也就是这个模块提供的功能。
|
6月前
|
负载均衡 Ubuntu 应用服务中间件
Apache(mod_proxy)+Tomcat负载均衡配置
Apache(mod_proxy)+Tomcat负载均衡配置

推荐镜像

更多