在多台后台管理服务器的自然环境下,为了更好地保证一个客户只与一台服务器通信,必须应用长连接。用什么方法来完成这种连接?一般用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粘性控制模块
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)