1

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

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

我的配置($proxy_add_connection 的工作方式与那里描述的相同)

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;

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

有什么我可以解决的吗?

4

1 回答 1

3

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

76/00 WebSocket 握手草案专门设计用于破坏未明确支持 WebSockets 的中介。由于 Nginx 所做的只是代理升级的 TCP 连接,它实际上并不了解 WebSocket 握手或正在使用的 WebSocket 的协议版本。因此,它无法执行草案 76/00 握手所需的非 HTTP 调整。

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

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

于 2013-05-10T20:31:58.583 回答