apache+Tomcat集群下session复制
原地址:https://blog.****.net/weiweiai123456/article/details/41750887
因为工作需要,本人需要在本机上做一个apache负载均衡Http请求,交给Tomcat集群处理,并且Session要在不同的Tomcat上进行复制的Demo。现贴出过程如下:
http://wenku.baidu.com/link?url=1Wy1oeJDLaBxnSTPLH0NPyYy0EGP1JokrYQfQhFj_uOt4Dhyh8Kg-q3N1TZhemu8otIHuK5JPrTOpXHAAu9fD1Q9sWFT-MhMm73n3uEz9KO
--好文章,重点推荐
http://www.open-open.com/lib/view/open1375282916217.html --配合JK插件apache负载均衡
http://nanquan.iteye.com/blog/1533906
http://jackandroid.iteye.com/blog/627147
http://www.cnblogs.com/peter9/archive/2011/12/18/2362138.html
一:准备工作
- LoadModule proxy_module modules/mod_proxy.so
- LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
- LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
- LoadModule proxy_connect_module modules/mod_proxy_connect.so
- LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
- LoadModule proxy_http_module modules/mod_proxy_http.so
- LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
- #LoadModule reqtimeout_module modules/mod_reqtimeout.so
- #LoadModule rewrite_module modules/mod_rewrite.so
- LoadModule setenvif_module modules/mod_setenvif.so
基本知识:
apache是http服务器,根据一定的配置,使用反向代理,处理http请求并转发给相应的tomcat进行处理。session的复制有两种方法。
1.1.粘性session。
同一个窗口的请求会交给同一个tomcat处理,避免了Session在不同的Tomcat之间跳来跳去。缺点是这台Tomcat挂掉则session就会空了。
需要在workers.properties文件中配置如下:
通过广播的形式进行不同tomcat间session的复制,对服务器性能有影响,需要在web.xml中配置如下:
- <distributable/>
1.3.apache配置
1.3.1.httpd.conf配置
httpd-vhosts.conf
进入到httpd.conf目录文件:
- LoadModule proxy_module modules/mod_proxy.so
- LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
- LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
- LoadModule proxy_connect_module modules/mod_proxy_connect.so
- LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
- LoadModule proxy_http_module modules/mod_proxy_http.so
- LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
- Include conf/extra/httpd-vhosts.conf
进入到httpd.conf文件最低行,添加如下:
- #分配请求
- ProxyRequests Off
- <proxy balancer://cluster>
- BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=tomcat1
- BalancerMember ajp://127.0.0.1:10009 loadfactor=1 route=tomcat2
- </proxy>
1.3.1.httpd-vhosts.conf配置
进入到httpd-vhosts.conf,最后一行添加如下代码,虚拟站点:
- <VirtualHost *:80>
- ServerAdmin [email protected]
- ServerName 127.0.0.1
- ServerAlias localhost
- ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
- ProxyPassReverse / balancer://cluster/
- ErrorLog "logs/lbtest-error.log"
- CustomLog "logs/lbtest-access.log" common
- </VirtualHost>
三:Tomcat配置
我有两个tomcat,如图:这里科普下:我因为是在本机上测试,所以不同的Tomcat的相关端口是不能重复的。
Tomcat中有三种端口,admin port端口(默认8005),http端口(默认8080),AJP端口(默认8009)。
首先修改tomcat1的相关端口配置,在server.xml
Tomcat1:
3.1.修改服务器端口为9005
3.2.修改连接端口为9080
3.3.修改jvmRoute和相关ajp端口
注意这里和之前的apache中配置匹配:如下:
- BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=tomcat1
3.4.tomcat配置中开启Session复制
找到如下代码:
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> </span>
Tomcat2上配置类似。
4.2.Tomcat1上test.jsp:
- <%@ page contentType="text/html; charset=UTF-8" %>
- <%@ page import="java.util.*" %>
- <html><head><title>Tomcat Cluster Demo</title></head>
- <body>
- Server Info:
- <%
- out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
- <%
- out.println("<br> ID " + session.getId()+"<br>");
- String dataName = request.getParameter("dataName");
- if (dataName != null && dataName.length() > 0) {
- String dataValue = request.getParameter("dataValue");
- session.setAttribute(dataName, dataValue);
- System.out.println("application:" + application.getAttribute(dataName));
- application.setAttribute(dataName, dataValue);
- }
- out.print("<b>Session List</b>");
- Enumeration<String> e = session.getAttributeNames();
- while (e.hasMoreElements()) {
- String name = e.nextElement();
- String value = session.getAttribute(name).toString();
- out.println( name + " = " + value+"<br>");
- System.out.println( name + " = " + value);
- }
- %>
- <form action="test.jsp" method="POST">
- Name:<input type=text size=20 name="dataName">
- <br>
- Value:<input type=text size=20 name="dataValue">
- <br>
- <input type=submit>
- </form>
- </body>
- </html>
4.3.Tomcat1上web.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
- <display-name>test</display-name>
- <distributable/>
- </web-app>
- <distributable/>
五:测试
输入url,apache会进行转发
刷新到Tomcat1:
刷新到Tomcat2: