nginx代理websocket中断主因是默认不透传upgrade/connection头且60秒超时断连;须配置proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade与connection "upgrade"、proxy_read_timeout/proxy_send_timeout设为86400、proxy_buffering off,并确保location路径匹配和https配置完整。

WebSocket 在 Nginx 代理下中断,多数不是网络或代码问题,而是 Nginx 把长连接当作了普通 HTTP 请求来处理——它默认不透传升级头、不维持空闲连接,60 秒就主动切断。解决的关键是让 Nginx 明白:这不是一次请求,而是一条持续双向通道。
必须透传的两个协议升级头
WebSocket 握手依赖 Upgrade 和 Connection 两个请求头,Nginx 默认不转发,必须显式配置:
-
proxy_set_header Upgrade $http_upgrade;——将客户端发来的
Upgrade: websocket原样透传 - proxy_set_header Connection "upgrade";——注意双引号,这是强制通知后端执行协议切换的指令,不是变量引用
漏掉任一,后端收不到升级信号,可能返回 400、200 或静默断连,无法完成 101 状态码响应。
延长超时并禁用缓冲
WebSocket 是流式通信,空闲时不发数据不代表失效。Nginx 默认 proxy_read_timeout 60 是主因:
- proxy_read_timeout 86400;——设为 24 小时(或 ≥ 前端心跳间隔),防止空闲断连
- proxy_send_timeout 86400;——避免大消息分片发送中途被中断
- proxy_buffering off;——禁用响应缓冲,否则 Nginx 可能缓存后端推送帧,破坏实时性
确保 location 与协议匹配准确
路径和协议配置错位会直接导致头丢失或握手失败:
- 使用精确或前缀匹配的
location /ws/ { },避免 rewrite 改写路径或 header - 若走 WSS,server 块中必须有完整 HTTPS 配置:
ssl_certificate、ssl_certificate_key、ssl_protocols TLSv1.2 TLSv1.3 - 显式声明 proxy_http_version 1.1;——HTTP/1.1 是 Upgrade 机制前提;HTTP/2 不支持 WebSocket 升级
验证是否真正生效
重启 Nginx 后,不能只看前端“连上了”,要确认底层握手正确:
- 浏览器 Network 面板中,WebSocket 请求响应状态码必须是 101 Switching Protocols,且响应头含
Upgrade: websocket和Connection: upgrade - 用 curl 模拟握手:
curl -i -H "Connection: Upgrade" -H "Upgrade: websocket" https://your-domain/ws/,观察返回头 - 查 Nginx error.log,搜索
upstream prematurely closed connection,出现即说明配置未生效











