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连接的请求放到用户验证登录成功之后
为了实时向页面端推送消息,使用了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连接的请求放到用户验证登录成功之后
相关文章推荐
- ubuntu 安装Nginx + rtmp + ffmpeg
- vagrant 的下 nginx
- 让nginx支持thinkphp的rewrite模式(url_model为2)
- nginx+fastcgi安装
- nginx负载均衡集群
- django uwsgi nginx
- Nginx常用命令
- nginx处理问题笔记
- nginx rewrite 参数和例子
- Nginx 安装(Linux CentOS)
- Linux运维 第五阶段(十一)keepalived+{nginx,haproxy}
- Nginx系列(二)--模块化
- 【Linux运维-集群技术进阶】Nginx强大的平滑升级
- Nginx 配置文件 参考
- 在Nginx 下运行 Laravel5.1 的配置
- Linux下Nginx的安装与配置
- 安装nginx+ngx_lua支持WAF防护功能
- Linux下安装Nginx1.8.0
- Windows下Nginx的安装与使用(一):配置端口转发
- mac os源码编译NGINX和PHP环境