nginx 1.2.0 - socket.io - HTTP/1.1 - 代理 websocket 连接

Posted

技术标签:

【中文标题】nginx 1.2.0 - socket.io - HTTP/1.1 - 代理 websocket 连接【英文标题】:nginx 1.2.0 - socket.io - HTTP/1.1 - Proxy websocket connections 【发布时间】:2012-05-06 22:35:41 【问题描述】:

我想用 nginx proxy_pass 模块替换我的 node-http-proxy 模块。正如我所读到的,新发布的 nginx 版本是否有可能支持开箱即用的 HTTP/1.1。我看到一些线程正在努力解决这个问题,nginx 不支持 websockets。

在我的情况下,我在后台运行多个节点项目,并希望将我的 websocket 连接从端口 80 路由到 8000-8100,具体取决于域。有没有不使用 tcp_module 插件的本地方式来做 websocket 代理/反向代理?

我尝试在 nginx.conf 中使用 proxy_passing 设置上游,但如果我尝试通过 websocket 连接到端口 80,我会收到 502 网关错误。

有人遇到同样的问题吗? 有没有人有 nginx + spcket.io 的工作示例,通过端口 80 代理?

【问题讨论】:

使用该插件是本机方式。 是的,这是可能的。要进行故障排除,如果包含 nginx.conf 会很有帮助。 【参考方案1】:

不,这还不可能; nginx 1.2 合并了来自 1.1.x 开发分支的东西,其中确实包括 HTTP/1.1 反向代理。 Websocket 连接是使用 HTTP/1.1 “升级”标头建立的,但 nginx 现在支持这种标头的事实并不意味着它支持 websockets(websockets 是不同的协议,而不是 HTTP)。 (我自己尝试使用 1.1.x 分支(我发现它对于我的目的来说足够稳定)并且没有 tcp_module 就无法工作)

Websockets 可能会在 1.3.x (http://trac.nginx.org/nginx/roadmap) 中得到支持。

你的选择是:

继续使用 node-http-proxy 使用没有tcp模块的nginx; socket.io 不会使用 websockets,而是使用其他东西(例如长轮询) 带有 tcp 模块的 nginx:在这种情况下,我认为您需要为该模块添加一个额外的端口(我自己从未尝试过) 在前面放点别的东西作为反向代理:我在 nginx 和 node.js 前面使用了 HAProxy(它支持 websockets)。 Nginx 现在只是充当静态文件服务器,而不是代理。如果您需要额外的缓存,清漆是另一种选择。

【讨论】:

感谢 Matthias 的澄清。对我来说,nginx 支持 websocket 代理是很自然的,如果它带有 HTTP1/1。我知道它不是 HTTP 协议,但我仍然需要做一些功课:) 在撰写本文时,Nginx 1.3 已经发布并支持 websockets。这是一个非常简单的配置,我已经 blogged about 希望对您有所帮助。【参考方案2】:

关于带有 TCP 模块的 NginX,我遇到的问题很少。 但最棘手的是尝试在 EC2 实例的 80 端口上使用 nginx 运行 websocket。

我描述了整个配置here

【讨论】:

以上是关于nginx 1.2.0 - socket.io - HTTP/1.1 - 代理 websocket 连接的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 不适用于 nginx

nginx 和 socket.io 解决方法

带有 nginx 负载平衡器问题的 Socket.IO 集群

带有 NGINX 和 http 2 的 Socket.io

Nginx 在 /socket.io 请求上返回 400

nginx 作为 NodeJS+socket.io 的代理:除了大消息外一切正常