25

我想用 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 代理?

4

2 回答 2

36

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

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

您的替代方案是:

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

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

我在这里描述了整个配置

于 2012-12-19T05:34:54.763 回答