Nginx未正确透传Upgrade/Connection头且超时设置过短导致WSS连接中断;须显式配置proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade"、proxy_http_version 1.1,并调大proxy_read_timeout、proxy_send_timeout至86400且禁用proxy_buffering。

HTTPS 握手成功但 WebSocket 连接后续中断,问题不在 TLS 层,而在于 Nginx 未正确维持升级后的长连接。核心矛盾是:Nginx 把已切换为 WebSocket 的连接,仍当作普通 HTTP 请求处理,触发默认超时与头转发缺失。
必须透传协议升级关键头部
WebSocket 握手依赖两个不可省略的请求头,Nginx 默认不转发,必须显式配置:
-
proxy_set_header Upgrade $http_upgrade;——将客户端发来的
Upgrade: websocket原样透传给后端 - proxy_set_header Connection "upgrade";——注意双引号包裹,这是强制通知后端执行协议升级的指令,不是变量引用
缺一不可。若漏掉任一字段,后端收不到升级信号,可能接受连接但拒绝通信,或在空闲后静默断开。
延长超时并禁用缓冲
WebSocket 是双向流式通信,Nginx 默认 60 秒的 proxy_read_timeout 会主动关闭无数据连接。需同步调整三项:
- proxy_read_timeout 86400;——设为 24 小时(或 ≥ 前端心跳间隔),防止空闲断连
- proxy_send_timeout 86400;——避免大消息分片发送过程中被中断
- proxy_buffering off;——禁用响应缓冲,否则 Nginx 可能缓存后端推送的数据,破坏实时性
确保 location 与 HTTPS 配置完整
WSS 连接要求路径匹配直接、SSL 链路可信:
- 使用 精确或前缀匹配的 location(如
location /ws/ { ... }),避免 rewrite 或 proxy_pass 后路径变更导致头丢失 - server 块中必须配置完整 SSL:ssl_certificate、ssl_certificate_key、ssl_protocols TLSv1.2 TLSv1.3;若用 Let’s Encrypt,确认续期后已重载 Nginx 并验证证书指纹
- 显式声明 proxy_http_version 1.1;——HTTP/1.1 是 Upgrade 机制的必要前提,HTTP/2 不支持 WebSocket 升级
验证是否真正生效
重启 Nginx 后,别只看前端是否连上,重点查三处:
- 浏览器 Network 面板中 WebSocket 请求的响应状态码必须是 101 Switching Protocols,且响应头含
Upgrade: websocket和Connection: upgrade - 用
curl -i -H "Connection: Upgrade" -H "Upgrade: websocket" https://your-domain/ws/模拟握手,观察返回头 - 检查 Nginx error.log,搜索
upstream prematurely closed connection或client closed connection——出现即说明后端提前断开或代理未保活


















