前言: <br/> <br/>websocket相信经常逛cnode社区的孩纸们都知道...具体API使用方式也再熟悉不过了...使用nodejs开发的websocket服务端也是品种繁多...github上总有你喜欢的...平时耍耍当然没问题...如果真要是承载一个生产环境服务的核心...总会有些问题需要你去解决. <br/> <br/>不可避免的问题: <br/> <br/>按照一个web请求占用线程数为参照...我们可以把nodejs称之为单线程语言...而java的servlet这种应该就是多线程语言了...我们可以想象在高并发情况下...单线程语言的运行风险还是蛮高的...毕竟如果一个请求出事那么整个线程(进程)就退出了...于是乎停止服务了...为了规避风险...我们常常会使用负载均衡技术...保证整个系统的对外正常服务... <br/> <br/>解决方案: <br/> <br/>负载均衡方案目前来讲...用apache的也不多了吧...普遍的解决方案是使用nginx配置多个upstream.实现负载均衡...例子如下: <br/><pre>http{ <br/>upstream http_sr { <br/> server 192.168.0.2:8080; <br/> server 192.168.0.3:8080; <br/>} <br/>server { <br/> listen 80 ; <br/> proxy_pass http_sr; <br/>} <br/>}</pre> <br/>这样对于部署在<span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace;font-size: 12px;line-height: 18px">192.168.0.2和3这两台机器上http服务...就通过这台nginx服务器实现了负载均衡...</span>但是websocket的服务端nginx的http反向代理是不能支持的.从websocket的<a href="//www.whatwg.org/specs/web-socket-protocol/"">specs</a>我们可以很明确的其实基于tcp协议的...http协议虽然也是基于tcp...它们都使用了tcp的握手方式...但是nginx的http_proxy_pass是不能支持websocket的... <br/> <br/>于是我们可以寻根问主...让nginx支持tcp_proxy_pass...那websocket负载均衡的问题不就迎刃而解了...nginx有丰富的第三方扩展...一顿搜索在github上找到了yaoweibin老师的<a href="https://github.com/yaoweibin/nginx_tcp_proxy_module">nginx_tcp_proxy_module</a> <br/> <br/> <br/> <br/>二话不说下载此模块...重新编译nginx(此过程略吧大家应该都懂) ...修改nginx配置文件加入下面conf: <br/><pre>tcp { <br/> upstream websocket { <br/> server 192.168.0.2:8080; <br/> server 192.168.0.3:8080; <br/> check interval=3000 rise=2 fall=5 timeout=1000; <br/> } <br/> server { <br/> listen 80; <br/> proxy_pass websocket; <br/> } <br/>}</pre> <br/>这个module的作者在description写到: <br/><pre> The motivation of writing these modules is Nginx’s high performance and <br/> robustness. At first, I developed this module just for general TCP <br/> proxy. And now, this module is frequently used in websocket reverse <br/> proxying.</pre> <br/>目前基本就是用来做websocket反向代理的...测试后确实是支持的...非常感谢module的开发者另外值得注意的是你要在nginx里同时配置tcp和http...那么它们是不能listen同一端口的...
推荐用HAProxy作为80端口的代理http://stackoverflow.com/questions/4360221/haproxy-websocket-disconnection/4737648#4737648
新的websocket规范不是已经去掉了导致websocket 不能通过目前http proxy的握手协议?是不是现在已经可以直接用nginx而不需要这个扩展了?
location / { proxy_pass http://127.0.0.1:9999; proxy_connect_timeout 60; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true;
# 下面是关键
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 这是配置webpysessoin丢失的问题
fastcgi_param SCRIPT_NAME "";
}