nginx 不执行 websocket 协议转换,仅透传升级请求并维持长连接;需配置 proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade 和 proxy_set_header connection $connection_upgrade 以支持握手,同时设置 proxy_read_timeout 和 proxy_send_timeout 保障长连接存活,ssl 终止时需通过 x-forwarded-proto 保持协议一致性。

Nginx 本身不执行 WebSocket 协议转换(比如把 HTTP 转成 WebSocket 帧),它只负责透传升级请求、维持长连接通道。所谓“协议自动转换”,实质是 Nginx 正确配合客户端与后端完成 HTTP → WebSocket 的握手协商,让整个升级流程不被拦截或降级。
关键不在“转换”,而在“不干扰升级”。
必须启用的协议协商机制
WebSocket 握手依赖标准 HTTP 升级流程,Nginx 默认会丢弃 Upgrade 和 Connection 头,并使用 HTTP/1.0 回退,导致 101 响应失败。要让它“自动”支持,需显式激活以下三项:
-
proxy_http_version 1.1:强制使用 HTTP/1.1,因为 WebSocket 升级仅定义在该版本中 -
proxy_set_header Upgrade $http_upgrade:将客户端原始的Upgrade: websocket头原样转发给后端 -
proxy_set_header Connection $connection_upgrade:动态设置 Connection 头——当$http_upgrade非空时设为"upgrade",否则设为"close"
⚠️ 注意:
$connection_upgrade是 Nginx 内置变量(1.3.10+),不能写死为"upgrade",否则非 WebSocket 请求也会触发升级,引发 400 错误。
超时配置保障长连接存活
WebSocket 连接建立后不再发 HTTP 请求,Nginx 默认 proxy_read_timeout 60 会主动断开空闲连接。必须延长:
-
proxy_read_timeout 86400(24 小时)或设为0(不限制) -
proxy_send_timeout 86400:防止后端发包间隔较长被中断
这两个值不影响握手阶段,只作用于升级成功后的数据传输期。
SSL 终止场景下的协议一致性
若 Nginx 终止 HTTPS(即用 wss:// 访问,后端走 ws://),需确保后端能识别真实协议:
- 添加
proxy_set_header X-Forwarded-Proto $scheme - 后端服务需检查该头:当值为
https时,生成wss://兼容的响应(如 Sec-WebSocket-Accept 验证不受影响,但部分框架校验Origin或协议头时会依赖此字段)
不需要额外编码或模块
Nginx 从 1.3 版本起原生支持 WebSocket 代理,无需安装第三方模块(如 nginx-websocket-module 已过时)。只要配置正确,客户端发起 wss://domain.com/ws 请求,Nginx 会:
- 接收
Upgrade: websocket+Connection: Upgrade - 用 HTTP/1.1 转发到后端
- 透传所有 WebSocket 相关头(包括
Sec-WebSocket-Key等) - 将后端返回的
101 Switching Protocols响应原样回传 - 此后所有帧数据直接透传,零解析、零修改
整个过程对协议无侵入,也无格式转换——这才是真正的“自动”。











