Nginx 1.2.0 - Socket.io - HTTP/1.1 - 代理 WebSocket 连接

25
我想用nginx的proxy_pass模块替换我的node-http-proxy模块。新版本的nginx是否支持HTTP / 1.1协议?我看到有些人在尝试使用nginx时遇到了问题,无法支持WebSockets连接。
在我的情况下,我正在后台运行几个node项目,并希望根据域将我的websocket连接从端口80转发到8000-8100。是否有一种本地方法来进行websocket代理/反向代理,而不使用tcp_module插件?
我尝试在nginx.conf中设置一个upstream并使用proxy_pass对其进行代理,但如果我尝试通过websocket连接到端口80,则会出现502网关错误。
有人遇到同样的问题吗?是否有任何使用nginx + spcket.io代理端口80的可行示例?

使用该插件是本地的方式。 - Dayo
是的,这是可能的。为了进行故障排除,如果您能够包含您的nginx.conf文件将会很有帮助。 - nil
2个回答

36
不,目前还不可能;nginx 1.2包含了来自1.1.x开发分支的内容,其中确实包括HTTP/1.1反向代理。Websocket连接是使用HTTP/1.1的“Upgrade”头建立的,但是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前面使用支持websockets的HAProxy作为反向代理。现在Nginx只是一个静态文件服务器,而不是代理。如果您需要额外的缓存,则可以选择Varnish。

谢谢澄清,马蒂亚斯。对我来说,如果nginx支持HTTP1/1,那么它自然也支持websocket代理。我知道这不是HTTP协议,但似乎我还需要做一些功课 :) - ayk
截至本文撰写时,Nginx 1.3已发布并支持WebSockets。这是一个相当简单的配置,我已经在我的博客中介绍过(http://metacogni.tv/blog/2013/02/19/websockets-with-nginx-plus-ssl-also/)。希望这能有所帮助。 - Octaflop

0
关于带有TCP模块的NginX,我遇到了一些问题。但最棘手的是在EC2实例上尝试在端口80上使用nginx运行您的WebSockets。
我在这里描述了整个配置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接