在 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 的重复侦听选项

nginx使用反向代理支持node.js服务

安装Nginx并为node.js设置反向代理

如何在 Ubuntu 上使用 pm2 和 Nginx 部署 Node.js 应用

如何在 Ubuntu 上使用 pm2 和 Nginx 部署 Node.js 应用

node.js 项目在本地机器上工作,在 Heroku 上部署时出现问题