版本说明:

httpd版本:2.4.6

tomcat版本:7.0.69

dedis版本:3.2.3

操作系统版本:CentOS Linux release 7.3.1611

拓扑结构:

tomcat-A/192.168.1.106

客户端------>httpd反向代理 ------->                                           ----- > redis会话保持服务器

192.168.1.101               tomcat-B/192.168.1.107                  192.168.1.100

httpd反向代理:

安装httpd服务

yum -y install  httpd

httpd实现反向代理需要三个modules的支持:

mod_proxy.so
mod_proxy_http.so
mod_proxy_balancer.so

编辑proxy配置

cat  /etc/httpd/conf.d/tomcat-proxy.conf
<proxy balancer://tcsrvs>balancermember http://192.168.1.106:8080balancermember http://192.168.1.107:8080proxyset lbmethod=byrequests   #调度方式,根据请求调度,类似于轮询
</proxy><virtualhost *:80>servername lb.tomcat.comproxyvia onproxyrequests offproxypreservehost on<proxy *>require all granted</proxy>proxypass / balancer://tcsrvs/proxypa***everse / balancer://tcsrvs/<location />require all granted</location>
</virtualhost>

tomcat服务器配置:

安装对应的软件包

java-1.8.0-openjdk
tomcat
tomcat-lib
tomcat-admin-webapps
tomcat-webapps
tomcat-docs-webapp

准备测试文件

mkdir /usr/share/tomcat/webapps/test/tomcat-A:
cat /usr/share/tomcat/webapps/test/index.jsp                                                       <%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="blue">TomcatA.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("tomcatA.com","tomcatA.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>tomcat-B:
cat /usr/share/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="red">TomcatB.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("tomcatB.com","tomcatB.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

然后启动tomcat服务

systemctl  start tomcat.service

此时在浏览器测试http://192.168.1.101/test/

以上只是完成了httpd调度后端tomcat主机的需求


当客户端访问时,不希望会话信息改变,试想一下,你在电商网站下了单了,然后刷新页面调度器把你的请求调度到另一台机器上,下的单没了,你作何感受?所以,为了避免这种现象的发生,我们通过设置cookie信息,来绑定会话

httpd服务器配置:

cat tomcat-proxy.conf  header add set-cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED #设置cookie信息
<proxy balancer://tcsrvs>balancermember http://192.168.1.106:8080 route=tomcatA loadfactor=1balancermember http://192.168.1.107:8080 route=tomcatB loadfactor=1proxyset lbmethod=byrequestsproxyset stickysession=ROUTEID   #基于会话粘性来设置cookie
</proxy>
#route与后端tomcat的jvmRoute对应
<virtualhost *:80>servername lb.tomcat.comproxyvia onproxyrequests offproxypreservehost on<proxy *>require all granted</proxy>proxypass / balancer://tcsrvs/proxypa***everse / balancer://tcsrvs/<location />require all granted</location>
</virtualhost>

tomcat主机配置:

vim server.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA">
#修改tomcat主机,jvmRoute是支持负载均衡的

在tomcatB主机也要做类似的修改

完成上述内容就能够实现基于cookie的会话粘性了,在浏览器测试http://192.168.1.101/test/就只会调到同一台主机,当此主机故障会调度到另一台主机


上述基于cookie的会话粘性存在一个问题,即客户端基于cookie访问后端服务器A,如果A主机故障,httpd会重新调度到B主机上,但是B上没有之前的会话信息,所以客户端浏览记录、下单情况等信息就消失了。

可以使用tomcat集群加单独的缓存服务器redis解决上述问题,tomcat集群解决主机单点故障问题,将会话信息单独存放在缓存服务器上而不是tomcat主机

,不过redis为了避免单点问题也要做高可用,这里我们只要能实现会话缓存功能即可。只有高可用大家有兴趣可以自己研究

配置session server的话就不用cookie信息,把httpd配置中的cookie配置删除

 vim tomcat-proxy.conf header add set-cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGEDproxyset stickysession=ROUTEID#将上述两行删掉或者注释,然后重启服务

tomcat主机配置集群:

cat server.xml
#在Engine字段下配置下述内容
<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.0.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>

以上内容很多,可以直接复制,不用做任何修改,两台主机都要配置

参考连接http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

注意官网模板配置中有两处错误:

 <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" /><ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />#官网中此处末尾都没有加结束符 /

然后修改web.xml

cat web.cml
<distributable/>
#此处指明tomcat的分布式集群

安装redis,并设置

yum -y install redis
vim /etc/redis.conf
bind 0.0.0.0
#指定监听所有地址,默认监听端口是tcp6379

然后启动redis服务

接着配置tomcat主机,本处以其中一台为例,另一台也要按此方式配置

cat context.xml   #编辑如下内容<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /><Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"host="192.168.1.100"port="6379"database="0"maxInactiveInterval="60" />
#192.168.1.100是redis的地址

准备jar包,三个jar包,其下载地址如下

https://github.com/izerui/tomcat-redis-session-manager.git

然后将这三个jar包,放到tomcat的库目录中,即/usr/share/tomcat/lib/

重启tomcat服务

此时打开浏览器测试http://192.168.1.101/test/,会发现sessionID不变,但调度的后端主机改变了

总结:

redis只修改监听地址即可,其他不用修改任何配置;

httpd只是启动反代的作用,关键是配置对后端主机的调度;

tomcat集群需修改server.xml和web.xml文件,配合redis缓存还需配置context.xml和准备jar包

结束

转载于:https://blog.51cto.com/panpangao/2046129

httpd反代 + tomcat cluster + redis会话保持相关推荐

  1. Nginx+httpd反代实现动静分离

    什么是动静分离 为了提高网站的响应速度,减轻程序服务器(apache+php,nginx+php等)的负载,对于静态资源比如图片,js,css,html等静态文件,我们可以在反向代理服务器中设置,将访 ...

  2. tomcat的部署及session绑定反代

    Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照 Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page ...

  3. 利用memcached做缓存服务器,为后端tomcat服务器做会话保持,利用httpd的jk模块模块做负载均衡...

    前端使用httpd作为反代负载均衡至后端tomcat主机:tomcat可用memcached当做会话服务器保存会话: 实验环境:物理机win7,虚拟机centos7 node1:172.18.11.1 ...

  4. tomcat 反代配置

    tomcat反代可以基于nginx , http进行反代 反代服务器: 有两个网口  反代服务器一般有两块网卡一块处于外网,一块处于内网用于与后端服务器通信 tomcat 节点处于内网地址 1 tom ...

  5. 王高利:Apache Httpd负载均衡Tomcat并实现Session Sticky和Session Cluster

    Apache Httpd负载均衡Tomcat并实现Session Sticky和Session Cluster http://anyisalin.blog.51cto.com/10917514/176 ...

  6. Tomcat通过Redis实现session共享的完整部署记录

    对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每 ...

  7. CentOS 7.1.1503 varnish动静分离反代用户请求

    前言 <> 非常感谢Kason老师,您是我们成功的蜡烛,燃烧着自己,照亮我们前进的道路. varnish配置动静分离时,这些问题困扰了两周: 环境:varnish做为反代,你们都知道的:v ...

  8. Nginx负载调度器+双Tomcat负载及会话共享+MySQL后端数据库

    Nginx负载调度器+双Tomcat负载及会话复制+MySQL后端数据库 环境: IP 作用 192.168.2.5 nginx 192.168.2.6 tomcat1 192.168.2.7 tom ...

  9. Rainbond最佳实践:Tomcat配置Redis实现Session共享

    Rainbond:生产级无服务器PaaS Rainbond是国内首个开源的生产级无服务器PaaS,深度整合基于Kubernetes的容器管理.多类型CI/CD应用构建与交付.多数据中心的资源管理等技术 ...

最新文章

  1. LSGO代码小组第16周复盘日志
  2. redis延迟队列 实现_灵感来袭,基于Redis的分布式延迟队列(续)
  3. 【转】Xcode7.1环境下上架iOS App到AppStore 流程 -- 不错!!
  4. Linux常用命令笔记---故障排除
  5. linux socket 多人聊天软件,Linux Socket编程---TCP实现多客户端的网络聊天室
  6. 在 Blazor WebAssembly 中使用 gRPC-Web
  7. BUAA - 各项目组对软件用户数的估计
  8. bcc挖矿用什么_BCC对BTC挖矿有何影响?
  9. 过拟合解决方法python_欠拟合、过拟合及其解决方法
  10. ul 原点显示_html ul li在div里圆点靠左对齐
  11. hibernate mysql 视图_转:hibernate映射视图的两种方式
  12. angularjs1-路由
  13. php网站渗透实战_PHP网站安全-漏洞渗透及解决方式—概述
  14. IDEA中JDBC连接MYSQL数据库步骤超详细总结
  15. Robo 3T下载安装和使用
  16. 555定时器产生对称三角波电路
  17. IntelCPU后缀含义
  18. 缓存架构技术:开课吧java高级架构师第七期笔记
  19. dynadot解析域名
  20. snmpwalk命令常用方法总结

热门文章

  1. 在linux上使用yum安装JDK
  2. luncene 查询字符串的解析—QueryParser类
  3. [转帖]IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?...
  4. 汉诺塔的实现 c++
  5. mysql-管理事务
  6. 2016级算法第一次练习赛-E.AlvinZH的儿时回忆——蛙声一片
  7. Shiro笔记(三)授权
  8. 【shell】shuf命令,随机排序
  9. 程序员保值的5个秘密
  10. 2015 UESTC Winter Training #10【Northeastern Europe 2009】