在Nginx里指定ip_hash的方式解决Tomcat集群session的问题

据称,Tomcat集群session同步方案有以下几种方式:

1)使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,在大并发下表现并不好。
2)利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session(并不是共享session解决)的问题! 并且如果应用是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。
3)利用nginx插件实现tomcat集群和session同步,nginx-upstream-jvm-route是一个Nginx的扩展模块,用来实现基于Cookie的Session Sticky的功能。但是遗憾的是,这个模块的补丁在nginx1.4版本之后就没有再更新了,所以nginx1.4之后版本跟该模块就不兼容了!!
4)利用memcached实现(MSM工具)。memcached存储session,并把多个tomcat的session集中管理,前端在利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时又能保证较高的性能。即通过MSM工具把Tomcat的Session序列化后保存到Memcached里面,从而实现Session共享.
5)利用redis实现。使用redis不仅仅可以将缓存的session持久化,还因为它支持的单个对象比较大,而且数据类型丰富,不只是缓存 session,还可以做其他用途,可以一举几得。Redis这种方式目前还不支持Tomcat8环境(现在网上插件不支持tomcat8,非要支持tomcat8,则需修改插件jar包的源代码)!
6)利用filter方法实现。这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简单容易控制。
7)利用terracotta服务器共享session。这种方式配置比较复杂。

下面实现的就是最简单的第二种方式:

nginx.conf里配置如下:

http {
    include       mime.types;
    default_type  application/octet-stream;

    access_log  logs/access.log;

    sendfile        on;

    keepalive_timeout  65;
    
    upstream tomcat{
        ip_hash;
        server localhost:8080;
        server localhost:8088;
    }

    server {
        listen       80;
        server_name  localhost;
        client_max_body_size 1024m;
        
        location / {
            proxy_pass http://tomcat;
            proxy_set_header Host $host:$server_port;
        }
        

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
...
}

上面upstream里ip_hash;一句就是实现访客固定访问一个后端服务器的方式,确实简单易行。

参考网页:

1.https://www.cnblogs.com/kevingrace/p/6398672.html

2.https://www.cnblogs.com/xiandedanteng/p/12055609.html

--END-- 2019-12-27 09:20

原文地址:https://www.cnblogs.com/heyang78/p/12105407.html