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

时间:2012-04-26 07:51:38

标签: proxy nginx websocket socket.io reverse-proxy

我想用nginx proxy_pass模块替换我的node-http-proxy模块。是否可以使用新发布的nginx版本,正如我已经读过的那样,它支持开箱即用的HTTP / 1.1。我看到一些与这个问题相关的线程,nginx不支持websockets。

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

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

任何人都面临同样的问题? 有没有人有一个nginx + spcket.io的工作示例,通过端口80进行代理?

2 个答案:

答案 0 :(得分:35)

不,这还不可能; nginx 1.2包含来自1.1.x开发分支的东西,它确实包含HTTP / 1.1反向代理。 Websocket连接是使用HTTP / 1.1“Upgrade”标头建立的,但是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而是使用其他东西(例如长轮询)
  • nginx with tcp module:在这种情况下,我认为你需要一个额外的端口用于这个模块(我从未尝试过这个)
  • 将其他东西放在前面作为反向代理:我在nginx和node之前使用HAProxy(它支持websockets)。 Nginx现在只是充当静态文件服务器,而不是代理。如果你想要额外的缓存,清漆是另一种选择。

答案 1 :(得分:0)

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

我描述了整个配置here