Nginx反向代理+Tomcat+memcached实现session server

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx反向代理+Tomcat+memcached实现session server相关的知识,希望对你有一定的参考价值。

写在前面


前一篇文章为大家解释说明了会话的类型,今天这篇文章将带领大家一步一步实现一个简单的session server,主要是让大家理解session server的工作过程,当然了对于中小向站点,这个结构也完全够用了。本节主体结构:

  • memcached-session-manager介绍

  • 网络拓扑结构

  • nginx反向代理配置

  • Tomcat配置

  • memcached配置

  • 测试

  • 错误分析

 

memcached-session-manager介绍


memcached-session-manager是一个将会话保存在memcached或Redis中的tomcat会话管理器,用于高可用的,可伸缩和容错的Web服务场景中。 它支持粘性和非粘性配置,目前正在使用tomcat 6.x,7.x和8.x. 对于粘性会话,支持会话故障转移(tomcat崩溃),对于非粘性会话,这是默认的(对于不同的请求,会话由不同的tomcats默认提供)。 此外memcached故障转移(memcached崩溃)通过会话迁移来实现。 也不应该有单点故障,所以当memcached失败时,会话不会丢失并且可以在tomcat或其他memcached中使用。

在配置上你必须把spymemcached jar和memcached-session-manager jar放到tomcat对应的lib目录下。 如果您想使用Redis而不是memcached,则需要使用Redis客户端“jedis”对应的.jar包, 还需要在Manager类并添加一些配置属性以便能够实现将会话存储至memcached中,memcached自身不具有配置功能,必须依赖前端的Tomcat或其他类服务器。

对于一个简单的实现,您只需要安装一个tomcat(6,7或8)和一个memcached或Redis(或支持memcached协议的s.th.)。 在您的生产环境中,您可能会拥有多个tomcats,并且在不同的硬件上也应该有多个memcached节点可用。 或者,您可以将会话数据存储在Redis中而不是memcached中。 您可以使用粘性会话或非粘性会话,memcached-session-manager(msm)支持两种操作模式。

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

 

网络拓扑结构


这里主要是用于一台Nginx实现前端调度,后面连接两台Tomcat应用程序服务器,在tomcat的后端添加两台memcached存储,实现一个小型的架构,当然了这里省略了离客户端最近的DNS服务器,以及靠近用户的一个负载均衡集群,以及负载均衡之后的缓存服务器集群。其简单架构与网络地址规划如下:

技术分享

本文的所有知己都是centos7.3版本


Nginx反向代理配置


对于nginx来说,这本实验中只是起了调度的作用,即反向代理的作用,并没有实现动静分离,路径重写等操作,这里主要是将客户端的请求调度至后端应用程序服务器Tomcat。所以配置起来就显得容易的多,只需要定义一个upstream组即可。然后按相应的算法调度即可。集体配置如下:

[[email protected] ~]# vim /etc/nginx/nginx.conf
...
http {
    upstream vinsent {                      # 定义服务器集群
            server 192.168.14.66:8080;
            server 192.168.14.77:8080;
    }
    server {
        listen       80 ;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                proxy_pass      #  将请求代理至后端Tomcat服务器
        }
        ...
}


Tomcat配置


Tomcat作为应用程序服务器,主要作用是处理jsp文件,在这里,我们需要提供一个用于测试的文件index.jsp以及对应版本的.jar包。主要是memcached-session-manager相关的jar包,和用于将前端的用户的cookie信息序列化成-值格式的工具,

1)安装tomcat及相关的服务包

[[email protected] tools]# cat /etc/redhat-release      # 版本检测
CentOS Linux release 7.3.1611 (Core)
[[email protected] tools]# iptables -F                  # 关闭防火墙与selinux
[[email protected] tools]# setenforce 0

[[email protected] tools]# yum install java-1.7.0-openjdk-devel.x86_64   #  安装jdk

[[email protected] tools]# yum installtomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp

2)提供context容器

分别在两个tomcat上的某host上定义一个用于测试的context容器,并在其中创建一个会话管理器。

[[email protected] webapps]# vim /etc/tomcat/server.xml 
...
    <Host name="node1.vin.cn" appBase="/data/webapps" autoDeploy="true">
    <Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
            memcachedNodes="n1:192.168.14.99:11211,n2:192.168.14.88:11211"
            failoverNodes="n1"
            requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
            transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
        />
    </Context>
    </Host>
...

3)分别为两个context提供测试页面

测试目录的结构如下

技术分享

[[email protected] webapps]# cat /usr/share/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
    <html>
        <head><title>TomcatA</title></head>
        <body>
            <h1><font color="green">TomcatA.vinsent.cn</font></h1>
            <table align="centre" border="1">
            <tr>
                <td>Session ID</td>
                <% session.setAttribute("vinsent.cn","vinsent.cn"); %>
                <td><%= session.getId() %></td>
            </tr>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
            </table>
        </body>
    </html>

# 说明:为了看到这个过程,你在TomCatB主机上应该将修改为TomcatB.vinsent.cn

4)下载jar包

这里的jar包主要分为两类,一种是memcached-session-manager相关的包,还有一种是与序列化相关的包:序列化包主要有4大类:

  • kryo-serializer:  msm-kryo-serializer, kryo-serializers-0.34+, kryo-3.x, minlog, reflectasm,  asm-5.x, objenesis-2.x

  • javolution-serializer:  msm-javolution-serializer, javolution-5.4.3.1

  • xstream-serializer:  msm-xstream-serializer, xstream, xmlpull, xpp3_min

  • flexjson-serializer: msm-flexjson-serializer, flexjson

下载地址:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration


    在这里我们选择分开放置,当然了你也可以全比放置在lib目录下:

[[email protected] webapps]# tree /usr/share/tomcat/webapps/test/
/usr/share/tomcat/webapps/test/
├── index.jsp
└── WEB-INF
    └── lib
        ├── javolution-5.4.3.1.jar
        └── msm-javolution-serializer-2.1.1.jar

2 directories, 3 files

[[email protected] webapps]# ls /usr/share/tomcat/lib/
annotations-api.jar      extras                                   tomcat7-websocket.jar  tomcat-jsp-2.2-api.jar
catalina-ant.jar         jasper-el.jar                            tomcat-api.jar         tomcat-juli.jar
catalina-ha.jar          jasper.jar                               tomcat-coyote.jar      tomcat-servlet-3.0-api.jar
catalina.jar             jasper-jdt.jar                           tomcat-el-2.2-api.jar  tomcat-util.jar
catalina-tribes.jar      log4j.jar                                tomcat-i18n-es.jar     websocket-api.jar
commons-collections.jar  memcached-session-manager-2.1.1.jar      tomcat-i18n-fr.jar
commons-dbcp.jar         memcached-session-manager-tc7-2.1.1.jar  tomcat-i18n-ja.jar
commons-pool.jar         spymemcached-2.12.3.jar                  tomcat-jdbc.jar



Memcached配置


对于memcached服务器的配置其实很简单,由于memcached自身不能够主动存储cookie信息,只需要在memcached服务器上安装memcached服务就行,至于对数据进行序列化则是由前面的服务器来实现的。

[[email protected] ~]# yum install memcached             # 安装memcached,我已安装
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Package memcached-1.4.15-10.el7.x86_64 already installed and latest version
Nothing to do
[[email protected] ~]# systemctl start memcached         # 启动服务
[[email protected] ~]# ss -tnl | grep 1121               # 检查服务是否正常启动
LISTEN     0      128          *:11211                    *:*                  
LISTEN     0      128         :::11211                   :::*


测试


我们在客户端进行测试。在浏览器中输入nginx的地址:刷新你会看到,访问的内容发生了改变,但是cookie值并没有发生改变

技术分享


错误分析


1 序列化出现故障,常见先向如下,没次访问cookie值都会随着改变,说明为存储至memcached数据库中。

技术分享

2 访问时提示404错误页

这种情况多数是context为配置正确,或则在提供的index.jsp文件所在的目录结构错误

3 版本不对应

     如果你能排除以上错误,仍然不能访问的话,说明你提供的jar包版本与你的tomcat版本不一致






本文出自 “vinsent” 博客,请务必保留此出处http://vinsent.blog.51cto.com/13116656/1979791

以上是关于Nginx反向代理+Tomcat+memcached实现session server的主要内容,如果未能解决你的问题,请参考以下文章

nginx+keepalived+tomcat+memcache负载均衡搭建小集群

nginx+tomcat简单反向代理+nginx监控

nginx反向代理配置不生效

nginx反向代理多个tomcat服务

IO复用

tomcat 配置nginx 反向代理