Nignx 连接tomcat时粘滞会话问题分析及解决方法

Nignx 连接tomcat时粘滞会话问题分析及解决方法,第1张

Nignx连接tomcat时粘滞会话问题分析及解决方法

在多台后台管理服务器的自然环境下,为了更好地保证一个客户只与一台服务器通信,必须应用长连接。用什么方法来完成这种连接?一般用nginx内置的ip_hash来做。我认为这不是一个好方法。如果前端开发是CDN,也就是说一个局域网内的客户另外浏览服务器,导致服务器分配不均衡,无法保证每次浏览都卡在同一个服务器上。根据cookies会是什么样的情况, 每台电脑都会有不同的cookies,既保持了长连接,又保证了服务器的工作压力平衡。

问题分析:

1.当请求最初返回时,在没有会话信息的情况下,jvm_route按照循环的方式发送给tomcat。

2.tomcat添加会话信息并将其返回给客户。

3.用户在这里请求。当jvm_route在会话中看到后端开发服务器的名称时,它将请求传输到匹配的服务器。

临时jvm_route控制模块与fair的默认设置不兼容。jvm_route的工作模式与公平相矛盾。对于一个特定的用户,当一直为他的项目服务的 tomcat服务器关闭时,它将默认重试max_failures的频率。如果还是不成功,会再次开启round robin模式,这种情况会导致用户的会话丢失。

一般来说,jvm_route根据session_cookie完成会话粘性,将特殊的会话附加到特殊的tomcat上,然后处理会话的不同问题,但是不能处理服务器宕机后的会话迁移问题。
如果没有这个jvm_route,如果用户再提出一个请求,由于没有会话信息,nignx会任意将请求再次推送到后端tomcat服务器。这种情况对于一般的访问页面来说没有问题。对于包含登录认证信息的请求,结果是您不能总是登录到应用服务器。
该控制模块根据会话cookie获取会话粘性。如果cookie和url中没有session,只是简单的循环三层切换。

处理上述类似问题大概有以下几种方式:

1)ip_hash(不强烈建议)

nginx中的Ip_hash技术可以将一个Ip的请求设置到同一个后端,这样某个手机客户端和这个ip下的某个后端开发就可以创建一个稳固的会话。ip_hash在上游配置中定义:

上游后端{
服务器192.168.12.10:8080;
服务器192.168.12.11:9090;
IP_hash;
}

强烈建议不要使用该应用程序,原因如下:

1.nginx不是前端开发的服务器。

Ip_hash规定nginx必须是最发达的服务器,否则nginx无法获得合适的Ip,所以无法根据ip进行哈希。比如squid用于前端开发,那么nginx在取ip时只能得到squid的服务器ip的详细地址,用这个详细地址进行分离无疑是无序的。

2.NGINX的后端开发在其他方面也有三层交换机。

如果nginx的后端开发还有其他三层交换机,按照其他方式分离请求,毫无疑问,某个手机客户端的请求无法准确定位到同一个会话应用服务器上。

3.几个外网地址出入口。

很多企业都有几个出入口,在网上有几个详细的ip地址。用户可以在浏览互联网技术时自动切换ip。而且这种情况并不罕见。如果应用了ip_hash,对于这种情况的用户是无效的,无法将某个用户与tomcat关联起来。

2)nginx_upstream_JVM_route(nginx扩展,强烈推荐应用)

-我试了下一个版本1.8,发现新版本已经不兼容了!!!擦擦。。但是听说1.4.2版本适用。

NGX_Upstream_JVM_Route是nginx的一个扩展控制模块,用于根据Cookie完成会话粘性的角色。

简单地说,它根据cookie中的JSsessionid决定将请求发送到哪个后端服务器。nginx_upstream_jvm_route会在用户第一次请求后端开发服务器时,将响应的服务器ID与cookie中的JSsessionid关联起来,然后在用户下一次请求时,nginx会根据JSsessionid决定哪个后端开发服务器来解决。


1.nginx_上游_jvm_路由安装

下载链接(http://nginx-upstream-jvm-route.googlecode.com/svn/trunk/SVN)

假设nginx_upstream_jvm_route的免费下载路径是/usr/local/nginx_upstream_JVM_route,

(1)获取nginx源代码

补丁-P0<;/usr/local/nginx_upstream_JVM_route/JVM_route.补丁

(2)./configure-with-http_stub_status_module-with-http_SSL_module -前缀=/usr/local/nginx-with-pcre=/usr/local/pcre-8.33 -add-module=/usr/local/nginx_upstream_JVM_route

(3)制造和销售;进行安装


2.nginx配备了

上游tomcats_JVM_route
{
#IP_hash;
server192.168.33.10:8090srun_id=Tomcat01;
server192.168.33.11:8090srun_id=Tomcat02;
JVM_route$cookie_JSESSIONID|sessionidreverse;
}


3.tomcat配备有

192.168.33.10:8090tomcat的server.xml被更改,

<enginename="Catalina"defaulthost="localhost">

更改为:

<enginename="Catalina"defaulthost="localhost"JVMroute="Tomcat01">

同样,在192.168.33.11:8090server.xml中,提升jvmRoute="tomcat02"。


4.测试

启动tomcat和nginx,浏览nginx代理,使用Google浏览器,F12,查询cookie中的JSESSIONID。
外形为ABCD123456OIUH897SDF.tomcat01,更新不变。

3)根据cookie的Nginx粘性控制模块


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/777866.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存