您的位置:首页 > 运维架构 > Nginx

Nginx(二) 实践中遇到问题

2016-01-09 14:10 337 查看
项目架构,Nginx+tomcat(三台)

为了实时向页面端推送消息,使用了WebSocket,一开始的时候用户访问登录页面就会发送WebSocket连接请求,同时登陆页面会调用一次验证码接口获取页面验证码,测试时,时不时的就会出现验证码验证不通过的错误(前提是用户验证码输入正确),经过反复研究测试,最终发现是由于如下原因导致的:

1.登录页面会向后台发两次请求,一次是获取验证码图片,一次是请求建立Websocket连接,因为使用了Nginx做分发(Sticky),当获取验证码的请求发送到服务器,此时nginx会在response的cookie里设置一个route=A(代表分配给当前请求的后台服务器),这是请求还未返回,WebSocket建立连接的请求也来到Nginx,因为cookie里没有设置route,nginx认为这是客户端第一次请求服务,那么它会设置一个route到response里,这里的route和请求验证码时的route有可能不一致(即两次请求不是被分到了不同的服务器),这时验证码请求返回(带回route=A),紧接着WebSocket请求返回(带回一个route,这个route值可能和A不一致),如果不一致,客户端浏览器的cookie里存储的route就是后面WebSocket请求返回的route(覆盖之前验证码请求带回的route),然后用户填写用户信息和验证码点击登录,这时Nginx发现请求的cookie里有route值,那就把这次请求分发到这个route对应的服务器,但这台服务器并不是获取验证码的那台服务器,因为验证码时存储在session上的(没有做session共享),所以自然找不到相应的验证码值,从而验证码校验不会通过。

2.解决方案

   2.1 把验证码存储到其他地方,不存在session里,比如内存数据库redis

   2.2  页面发送建立WebSocket连接的请求放到用户验证登录成功之后
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: