在 node.js 服务器上使用 nginx 时出现“websocket 连接无效”
Posted
技术标签:
【中文标题】在 node.js 服务器上使用 nginx 时出现“websocket 连接无效”【英文标题】:"websocket connection invalid" when using nginx on node.js server 【发布时间】:2012-03-04 14:45:23 【问题描述】:我正在使用 Express.js 创建一个服务器,我可以使用 Web 套接字连接到该服务器。
尽管它最终似乎可以工作(即连接并将事件传递给客户端),但我最初在 Chrome 的控制台中收到错误:
意外响应代码:502
在后端,socket.io 只记录warn - websocket connection invalid
。
但是,nginx 会记录以下内容:
2012/02/12 23:30:03 [错误] 25061#0: *81 上游过早关闭 从上游读取响应标头时连接,客户端: 71.122.117.15,服务器:www.example.com,请求:“GET /socket.io/1/websocket/1378920683898138448 HTTP/1.1”,上游: "http://127.0.0.1:8090/socket.io/1/websocket/1378920683898138448", 主机:“www.example.com”
注意:我正在运行 nginx 开发:nginx version: nginx/1.1.14
,所以它应该支持 HTTP/1.1。
还要注意,如果我只使用没有 nginx 的 node.js 服务器,它可以在没有任何警告的情况下工作。
最后,这是我的 nginx 配置文件:
server
listen 0.0.0.0:80;
server_name www.example.com;
access_log /var/log/nginx/example.com.log;
location /
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://node;
proxy_redirect off;
upstream node
server 127.0.0.1:8090;
任何帮助将不胜感激。我尝试了question 中建议的修复方法,但也没有用。
【问题讨论】:
【参考方案1】:nginx 仅在不稳定的 1.1 分支中提供某种 Web Socket 支持。请参阅 Socket.IO wiki。
Afaik 目前只有少数稳定的基于 Node.js 的 http 代理能够正确支持 Web 套接字。
查看 node-http-proxy(我们使用这个):
https://github.com/nodejitsu/node-http-proxy
还有弹力:
https://github.com/substack/bouncy
或者你可以使用纯TCP代理如HAproxy
更新!
nginx (1.3.13>=) 支持开箱即用的 websocket!
http://nginx.org/en/docs/http/websocket.html
【讨论】:
我以为它在 dev 分支中被支持?! 我最终按照你的建议使用了bouncy
,@Epeli。 nginx 1.1.14,很像 1.1.4 似乎不像这里所说的那样工作:注意:在撰写本文时 (v1.1.4),Nginx 1.1 仍然不支持 Web 套接字。
我在 NGINX@1.1.16 中收到了类似的错误。它正在工作,但速度很慢,这可能意味着它使用了不同的传输机制。
我在 NGINX 1.2.3 上看到了同样的问题,它应该可以工作。有人吗?
我认为1.3.13是nginx第一个支持websockets的版本以上是关于在 node.js 服务器上使用 nginx 时出现“websocket 连接无效”的主要内容,如果未能解决你的问题,请参考以下文章
在同一 nginx 服务器上使用 SSL 的两个 node.js 域 - 443 的重复侦听选项
如何在 Ubuntu 上使用 pm2 和 Nginx 部署 Node.js 应用