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的主要内容,如果未能解决你的问题,请参考以下文章