Nginx:反向代理 WebSocket Draft 76

Posted

技术标签:

【中文标题】Nginx:反向代理 WebSocket Draft 76【英文标题】:Nginx: Reverse proxying WebSocket Draft 76 【发布时间】:2013-05-03 14:44:18 【问题描述】:

我使用的是 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 的工作方式与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;

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

有什么办法可以解决吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于Nginx:反向代理 WebSocket Draft 76的主要内容,如果未能解决你的问题,请参考以下文章

配置 Nginx 反向代理 WebSocket

Nginx反向代理websocket配置实例

Nginx实现HTTP和WebSocket的反向代理

Nginx实战之反向代理WebSocket的配置实例

无法使用 Nginx 反向代理连接到 Websocket 服务器

nginx websocket反向代理配置