WebSocket 在 Nginx 代理下需配置 HTTP/1.1、透传 Upgrade 和 Connection 头、禁用缓冲、延长读写超时,并确保 location 直接匹配且 HTTPS 配置完整,验证状态码 101 及日志无 upstream 关闭错误。

WebSocket 在 Nginx 代理下容易因默认超时机制被意外关闭,核心是 Nginx 将其当作普通 HTTP 连接处理,未启用长连接支持。需显式配置升级协议、禁用缓冲和调整超时时间。
启用 WebSocket 协议升级
Nginx 默认不识别 Upgrade: websocket 请求头,必须手动透传关键头部并允许协议切换:
- 添加
proxy_http_version 1.1;—— 启用 HTTP/1.1,支持连接保持和 Upgrade 机制 - 设置
proxy_set_header Upgrade $http_upgrade;—— 透传客户端的 Upgrade 请求头(如websocket) - 设置
proxy_set_header Connection "upgrade";—— 显式告诉后端“本次连接要升级”,避免被当作普通 HTTP 关闭
关闭响应缓冲与代理读取超时
WebSocket 是双向实时通信,Nginx 若启用缓冲或过早等待响应,会中断流式数据:
- 添加
proxy_buffering off;—— 禁用响应缓冲,防止 Nginx 缓存后端推送的数据 - 设置
proxy_read_timeout 86400;—— 大幅延长读超时(例如设为 24 小时),避免空闲时断连;该值应 ≥ 前端心跳间隔 - 可选加
proxy_send_timeout 86400;—— 防止大消息发送过程被中断
检查 location 匹配与 SSL 配置(如使用 HTTPS)
WebSocket 的 wss:// 连接要求反向代理也走 HTTPS,且路径匹配不能依赖重写逻辑:
- 确保
location直接匹配 WebSocket 路径(如location /ws/ { ... }),避免中间 rewrite 改变请求头 - 若前端通过 HTTPS 访问 wss,Nginx SSL 配置需完整(含证书、密钥、
ssl_protocols和ssl_ciphers),否则浏览器拒绝建立连接 - HTTPS 下务必在 server 块中启用
ssl http_v2;(如支持 HTTP/2),但注意:HTTP/2 不支持 WebSocket 升级,所以仍需proxy_http_version 1.1;
验证与调试技巧
配置生效后,可通过以下方式确认是否正常:
- 浏览器开发者工具 Network 标签中查看 WebSocket 连接状态码应为
101 Switching Protocols - 用
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" http://your-domain/ws/模拟握手,观察响应头是否含Upgrade: websocket和Connection: upgrade - 检查 Nginx 错误日志(
error_log /path/to/error.log notice;),搜索upstream prematurely closed connection或client closed connection线索

















