Notepad++Good Luck To You!

nginx+tomcat7(8) 集群,负载均衡和session共享

参考文档:centos7上安装tomcat7 
参考文档:nginx+tomcat7的集群

1.环境准备和配置

服务器ip操作系统备注
tomcat-001192.168.1.215Centos7
tomcat-001192.168.1.216Centos7
nginx-001192.168.1.217Centos7
nginx-002192.168.1.218Centos7

CentOS7 下面通过keepalived 配置nginx 主从方式的双机热备配置,看这个博文

2.安装Centos7

  • 安装操作系统

  • 安装ntp

3.安装tomcat7

4.安装nginx

  • 通过yum 安装 nginx

5.安装tomcat 测试程序(nginx动静分离和tomcat集群)

  • 增加一个ClusterTest.war 文件 放入到 /usr/share/tomcat/webapps目录下。

index.jsp文件如下

<%@ page language="java" %><html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA </font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("abc","abc"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body></html>

配置tomcat的server.xml (vim /usr/share/tomcat/conf/server.xml), 
增加如下代码,位于host 部分

<Context path="" reloadable="true" docBase="/usr/share/tomcat/webapps/ClusterTest"/>1

使得tomcat 的根访问是 指向ClusterTest这个目录 
http://192.168.1.215:8080/ 
http://192.168.1.216:8080/

- 6.配置nginx,实现tomcat负载均衡

  • vim /etc/nginx/nginx.conf

#修改events的块内容events {
    use epoll;
    worker_connections  2048;
}#在http块里面增加如下内容
    #开启zip网页压缩
    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 8k;
    gzip_http_version 1.1;
    gzip_types text/plain application/x-javascript text/css application/xml;    #反向代理
    ## meerkat_web
    upstream meerkat_web {            #ip_hash; #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
            server 192.168.1.215:8080 weight=1 max_fails=2 fail_timeout=30s;
            server 192.168.1.216:8080 weight=2 max_fails=2 fail_timeout=30s;
    }# 在server块里面的location部分替换成如下内容
            location / {
                root   html;
                index  index.html index.htm index.jsp;
                proxy_pass  http://meerkat_web;
                proxy_set_header Host  $http_host;
                proxy_set_header Cookie $http_cookie;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                client_max_body_size  100m;
            }

参考文档: nginx负载均衡基于ip_hash的session粘帖的几种用法

- 7.测试

  • a.测试自动切换 
    访问http://192.168.1.217/ 代表的nginx服务器,会出现index.jsp显示的效果。这个时候如果关闭对应的tomcat服务,就会自动切换到另外一台上。

  • b.测试负载均衡 
    访问http://192.168.1.217/ 代表的nginx服务器,会出现index.jsp显示的效果。但是多次刷新后,一直显示的是同一台tomcat服务。说明负载均衡没有实现。解决的办法是把upstream里面的 ip_hash 这个给屏蔽掉。就会自动切换了。

- 8.实现Session共享的几种方法

  1. 使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,在大并发下表现并不好。

  2. 利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。但如果应用是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。

  3. 利用memcached把多个tomcat的session集中管理,前端在利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时又能保证较高的性能。

我们这里采用第三种方法

- 9.在2台tomcat节点上安装memcached

  • a. yum 安装memcached

yum -y install memcached
vim /etc/sysconfig/memcached//重启,启动,开机启动,状态,关闭systemctl restart memcached
systemctl start memcached
systemctl enable memcached
systemctl status memcached
systemctl stop memcached


memcached-tool  127.0.0.1:11211 stats

- 10. 在2台tomcat节点上安装和使用memcached-session-manager

官网: 
https://github.com/magro/memcached-session-manager 
安装手册: 
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration#add-memcached-session-manager-jars-to-tomcat 
MSM支持两种模式:sticky sessions(粘性session)和non-sticky sessions(非粘性session)。我用到的是non-sticky session 
按照操作手册下载多个jar文件放入 $CATALINA_HOME\lib目录下: 
由于版本的问题 
这里整理了能够配合Tomcat7.0.54, Tomcat 8.0.33 和 Tomcat 8.0.36使用的memcashed-session-manager的所有需要的jar文件。

下载tomcat7 用的jar包 
下载tomcat 8.0.33 可用的jar包(8.0.36不可用)

#tomcat 8.0.36 测试下来用这些jar文件cd /usr/local/src#下载 memcached-session-manager jars to tomcatwget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/1.9.5/memcached-session-manager-1.9.5.jarwget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc8/1.9.5/memcached-session-manager-tc8-1.9.5.jar# 使用memcached 的时候要用到的jar文件wget http://repo1.maven.org/maven2/net/spy/spymemcached/2.11.1/spymemcached-2.11.1.jar# 使用javolution-serializer的时候用到的jar文件下载wget http://repo1.maven.org/maven2/de/javakaffee/msm/msm-javolution-serializer/1.9.5/msm-javolution-serializer-1.9.5.jarwget http://www.java2s.com/Code/JarDownload/javolution/javolution-5.5.1.jar.zipunzip javolution-5.5.1.jar.zip# 下面是使用kryo-serializer的时候用到的jar文件下载wget http://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/1.9.5/msm-kryo-serializer-1.9.5.jarwget http://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.9/kryo-serializers-0.9.jar#(相配合的kryo只能用3.+的版本。)wget http://repo1.maven.org/maven2/com/esotericsoftware/kryo/3.0.3/kryo-3.0.3.jarwget http://repo1.maven.org/maven2/com/esotericsoftware/minlog/1.3.0/minlog-1.3.0.jarwget http://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.3/reflectasm-1.11.3.jarwget http://repo1.maven.org/maven2/org/ow2/asm/asm/5.1/asm-5.1.jarmv *.jar $CATALINA_HOME/lib/123456789101112131415161718192021222324252627282930313233343536

- 11. Tomcat8.0.36中配置memcached-session-manager

  • 修改tomcat的context.xml增加如下内容:

<Context>  ...
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                sticky="false"
                memcachedNodes="n1:192.168.1.215:11211 n2:192.168.1.216:11211"
                failoverNodes=""
                requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico)$"
                sessionBackupAsync="false"
                sessionBackupTimeout="500"
                #使用kryo组件做序列化#transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 
                #使用javo做序列化transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
        />
</Context>

这里的memcachedNodes节点中的n1为节点的别名,可以随意起。后面的IP必须是memcached所在的主机的IP地址,端口必须是之前配置的11211端口。 
该代码段在网上发现其他人说也可以放到Server.xml下面,这里本人没有尝试。 
此时,所有的tomcat子节点中都要加上上面的这段代码,每个tomcat里面的内容都是相同的上述内容,无需做任何修改。

sticky=”false” #非黏性设置,默认为黏性

memcachedNodes #配置memcached节点

failoverNodes #默认为空,如果这里指定memcached冗余节点的话,sticky一定要为true,否则会报错

requestUriIgnorePattern #忽略session的正则表达式

sessionBackupAsync #指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout

sessionBackupTimeout #设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync=”false”是起作用。默认100毫秒

transcoderFactoryClass #默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory此属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。

customConverter #可选项,自定义转换器允许您提供应用程序特定类型的自定义序列化。多个自定义转换器类名称指定逗号隔开(可选空间逗号后)。转换器类必须在类路径中可用的web应用程序(WEB-INF/lib中),在这里可以不设置。

至此为止,有关memcache的Session共享已经完全配置完成. 
具体的启动顺序,首先要把memcached的服务启动,然后是nginx服务,最后启动tomcat所在的每个子节点的服务。

- 12. 测试session复制,共享功能是否成功

  • 在/usr/share/tomcat/webapps/ClusterTest目录下增加sessiontest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%><%@ page import="java.util.*"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>ClusterApp Test</title></head><body>
        访问的Nginx IP:<%=request.getServerName()%>
        <BR>
        Tomcat SessionPort:<%=request.getServerPort()%>
        <%
                out.println("Tomcat Server Info=" + request.getLocalAddr() + " : "     + request.getLocalPort() + "<br>");
                out.println("当前 Session ID=" + session.getId() + "<br>");
        %>

        <%                String dataName = request.getParameter("dataName");                if (dataName != null && dataName.length() > 0) {                        String dataValue = request.getParameter("dataValue");
                        session.setAttribute(dataName, dataValue);
                }

                out.println("<b>Session列表</b><br>");
                System.out.println("Session列表");
                Enumeration e = session.getAttributeNames();                while (e.hasMoreElements()) {                        String name = (String) e.nextElement();                        String value = session.getAttribute(name).toString();
                        out.println(name + " = " + value + "<br>");
                        System.out.println(name + " = " + value);
                }
        %>

        <form action="sessiontest.html" method="POST">
                名称:<input type=text size=20 name="dataName"> <br/>
                值:<input type=text size=20 name="dataValue"> <br/>
                <input type=submit text="提交">
        </form></body></html>


  • 访问nginx服务器http://192.168.1.217/sessiontest.jsp

  • 查看结果 

    • 这里写图片描述
      这里写图片描述
      比较上面2个图的红框部分。可以发现 在2个tomcat的服务器之间切换,但是sessionID不变,并且session里面的内容也不变。说明session共享成功。


«    2023年7月    »
12
3456789
10111213141516
17181920212223
24252627282930
31
TOP 搜索
TOP 控制面板
您好,欢迎到访网站!
  查看权限
TOP 最新留言
    TOP 作者列表
    TOP 站点信息
    • 文章总数:163
    • 页面总数:0
    • 分类总数:6
    • 标签总数:20
    • 评论总数:0
    • 浏览总数:312004
    召唤伊斯特瓦尔