2013-05-03 229 views
1

我正在使用nginx 1.4.0,它可以很好地处理较新的WebSocket版本,但草案76是一个问题。我的后端(基于Netty中的Java应用程序)似乎并没有收到握手请求,并且在Nginx的错误日志我Nginx:反向代理WebSocket草案76

[error] 7662#0: *3720 upstream timed out (110: Connection timed out) while reading response header from upstream 

我的配置($ proxy_add_connection以同样的方式描述there

include proxy_params; 
proxy_pass http://127.0.0.1:8001/; 
proxy_http_version 1.1; 
proxy_set_header Connection $proxy_add_connection; 
proxy_set_header Upgrade $http_upgrade; 

如果我直接连接到后端,它工作正常。

有什么我可以做的,以解决它?

回答

3

Nginx最近对支持WebSocket代理的更改不支持WebSocket本身,而是允许它识别将连接从HTTP升级到另一个协议的请求。当它得到这样的请求时,它现在建立到后端的隧道,而不是将连接丢弃为无效。 RFC6455 WebSocket握手是一种标准的HTTP协议升级请求,因此它适用于这种新功能。

76/00 WebSocket握手草案是专门为打破没有明确支持WebSocket的中介而设计的。正如Nginx所做的那样是代理升级后的TCP连接,它实际上并不理解WebSocket握手或正在使用的WebSocket的协议版本。因此,它无法执行76/00握手草案要求的非HTTP调整。

为了支持WebSocket的76/00版本,Nginx必须实现特殊的草稿76/00检测和处理逻辑。鉴于添加非HTTP逻辑的复杂性以及76/00草案未完成的质量和可疑的安全性,代理中介机构不太可能支持它。

如果您的用户完全依赖2 - 3年前版本的Chrome/Safari,则Flash后备或原始TCP负载平衡可能是您最好的选择。