小皮博客 | Xiaopi's Blog

13-ngix负载均衡系列1-tomcat共享session

说明: Tomcat作为Web容器,其并发能力在500左右,因此tomcat项目下的静态资源文件应该考虑放到Nginx或者其他静态资源文件管理器中更加合适。在负载均衡策略当中,应该考虑对开发人员透明的运维方案(通过Nginx转发重定向,这也是Nginx相对于LVS的优势所在,并且可以在后续的负载均衡策略中优化为LVS+Nginx的架构)。

title-img

准备工作

  • 所有的Tomcat对应的webapp发布时,在web.xml文件中加入
  • 准备两台服务器(虚拟机)
1
2
192.168.133.132(Nginx加2*Tomcat) 
192.168.133.131(1*Tomcat)
  • 确定nginx和两台tomcat可以互访,并且两个tomcat机器在一个网段内;
  • 确定两台tomcat多播已经打开,在Linux机器上可以使用cat /proc/net/dev_mcast检查,如果文件存在基本上就是打开了;
  • 确定两台tomcat机器的/etc/hosts文件中包含“xxx.xxx.xxx.xxx hostname”比如“192.168.133.132 tomcat1”

tomcat安装与配置

jdk与tomcat的安装过程略过(加入一个其他的参考文献链接)

选择一个Web实验项目

使用$TOMCAT_HOME/webapps/examples/作为实验项目

修改项目路径下的 WEB-INF/web.xml

1
2
3
4
5
6
在<display-name>Servlet and JSP Examples</display-name>后添加
<!-- tomcat集群session复制使用 -->
<distributable />
并且将home.jsp作为默认访问的文件
<welcome-file-list>
<welcome-file>home.jsp</welcome-file>

增加home.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<html>
<head>
<title></title>
</head>
<body>
<%
String mydata = request.getParameter("mydata");
if (mydata != null && mydata.length() != 0) {
session.setAttribute("mydata", mydata);
}

out.println("request.getLocalAddr(): " + request.getLocalAddr());
out.println("<br/>");
out.println("request.getLocalPort(): " + request.getLocalPort());
out.println("<br/>");
out.println("Session ID: " + session.getId());
out.println("<br/>");

out.println("mydata: " + session.getAttribute("mydata"));
%>
<form>
<input type=text size=20 name="mydata">
<br>
<input type=submit>
</form>
</body>
</html>

测试尚未配置复杂均衡时的效果

分别访问:
http://192.168.133.132:8080/examples/
http://192.168.133.134:8080/examples/

section-img-01-01

section-img-01-02

不难看出,两者的Session ID并不相同,说明此时的tomcat还未支持共享session;


配置tomcat进行session共享

修改$TOMCAT_HOME/conf/server.xml修改Cluster节点配置。

最简单的配置为

1
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

但是为了避免Session风暴,过多的无意义Session共享, 我们采用如下配置:具体的配置请参考Tomcat官方文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!--开始Tomcat集群配置-->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">

<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<!--
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
-->
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.5"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.133.132"
port="8080"
selectorTimeout="100"
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;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;"/>

<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
<!--结束TOMCAT集群配置-->

配置nginx负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
http{
# 其他默认配置忽略
......
upstream localhost {
server 192.168.133.132:8080 weight=1;
server 192.168.133.134:8080 weight=2;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost;
}
}
.....
}

配置完成之后重启nginx服务器

集群测试

多次访问http://192.168.133.132/examples/,效果如下:

可以看出访问的是不同的tomcat服务器,但是SessionID是一样的,并且一开始用户访问的是tomcat2

section-img-02-01

section-img-02-02

版权声明

本文标题:13-ngix负载均衡系列1-tomcat共享session

文章作者:盛领

发布时间:2015年01月16日 - 18:09:23

原始链接:http://blog.xiaoyuyu.net/post/7c3073a7.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

如您有任何商业合作或者授权方面的协商,请给我留言:sunsetxiao@126.com

盛领 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!