16
回答
Nginx + GlassFish集群下Session共享问题
华为云4核8G,高性能云服务器,免费试用   

GlassFish创建了一个集群,集群下面两个实例,端口分别使用38080和38081,默认端口!

前端用Nginx,转发到后端的GlassFish集群上,采用clusterjsp作为测试项目。

每次刷新,38080和38081上的实例是轮询访问,session每次都不同。

将前端换做Apache,通过Proxy方式做反向代理,同样转发到后端GlassFish集群上。

每次刷新,38080和38081上的实例同样是轮训访问,session却每次都相同。

不太明白,这里Apache没做多余配置,仅仅使用了反向代理,为何和Nginx的测试结果这么不一样!

apache配置:
ProxyPass / balancer://clusterjsp/
<Proxy balancer://clusterjsp>
   BalancerMember  http://127.0.0.1:38080/  max=800 loadfactor=10
   BalancerMember  http://127.0.0.1:38081/  max=800 loadfactor=10
</Proxy>

 

举报
小权
发帖于8年前 16回/5K+阅
共有16个答案 最后回答: 5年前

引用来自#2楼“范堡”的帖子

嘿,你可以试试 Nginx 反向代理中的 Session 粘贴转发功能。

http://opensource.csdn.net/bbs/thread/621

或者你试试贴出你 Nginx 的 proxy 参数配置

地址好像贴错了!

session在项目中肯定是要用了,如果只是定向到后端的一个应用上,那么这个应用挂了用户就得重新登录了!

引用来自#4楼“小编辑”的帖子

不太明白你想干嘛,你是想 Session Sticky 呢,还是不想呢?

可能是我没表达清楚!

关心的问题是:如何使用Nginx+GlassFish,在集群的环境下,挂了一个,这个应用上的用户如何平滑过度到另一上面。

Session Sticky是将同一个访问转发到同一个应用上,但是在Nignx+GlassFish集群下如何做到一个应用挂了,平滑过度到另一个应用上?

也可以不要Session Sticky,就每个应用去轮询访问,只要Session做了同步。

所以我关心的不是Session Sticky想要不想要,而是Nginx+GlassFish集群下的session是如何同步的?

上面我做了两组测试,使用了GlassFish的session复制:

1、通过在Apache+GlassFish 测试clusterjsp可以实现这个平滑过度,后台两个应用关闭一个应用,访问,然后再重启这个应用,对前台的Session数据没任何影响。

2、同样的应用,前端换成Nginx却不行。

一是想知道为什么不行,二是有没有什么其他办法可以解决?

谢谢,希望这次表达清楚了!

不需要任何配置,做了集群就可以自动的在某个节点挂机时自动切换到其他节点。

另外因为你使用了Session了,你必须在每个节点的Glassfish做session数据的复制,或者叫同步,详细的做法请参考Glassfish的手册。

引用来自#6楼“红薯”的帖子

不需要任何配置,做了集群就可以自动的在某个节点挂机时自动切换到其他节点。

另外因为你使用了Session了,你必须在每个节点的Glassfish做session数据的复制,或者叫同步,详细的做法请参考Glassfish的手册。

你说的这两个都不是问题了,也已配好。

通过Apache+GlassFish集群就能体现出来,现在是通过Nginx+GlassFish集群无法体现出来这个!通过Nginx前端每次刷新都会生成新的sessionID

引用来自#8楼“红薯”的帖子

Nginx 并不会对 cookie 做任何的操作,把你的 Nginx 配置贴出来看看。

nginx 配置单,目前仅是测试环境,没做优化!

 

nginx.conf:

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    upstream glassfish{
         server 172.16.100.110:38080 weight=10;
         server 172.16.100.110:38081 weight=10;
        }
    server {
        listen       80;
        server_name  172.16.100.110;

        location /NginxStatus/ {
            stub_status on;
        }
    location / {
         proxy_pass http://glassfish/clusterjsp/;
         include proxy.conf;
         index index.html index.htm index.jsp;
       }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
     }
}

proxy.conf:

proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

 

引用来自#9楼“小权”的帖子

引用来自#8楼“红薯”的帖子

Nginx 并不会对 cookie 做任何的操作,把你的 Nginx 配置贴出来看看。

nginx 配置单,目前仅是测试环境,没做优化!

nginx.conf:

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    upstream glassfish{
         server 172.16.100.110:38080 weight=10;
         server 172.16.100.110:38081 weight=10;
        }
    server {
        listen       80;
        server_name  172.16.100.110;

        location /NginxStatus/ {
            stub_status on;
        }
    location / {
         proxy_pass http://glassfish/clusterjsp/;
         include proxy.conf;
         index index.html index.htm index.jsp;
       }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
     }
}

proxy.conf:

proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

上图是Nginx+GlassFish下clusterjsp的页面图,每次刷新,轮询访问a1和a2实例,每次session id都会生成新的。

下面两图示Apache+GlassFish下clusterjsp的页面图,可以看出,轮询访问a1和a2实例,每次session id都一样。

a2:

a1:

顶部