Nginx WebSocket代理超时配置核心是协同设置proxy_read_timeout与proxy_send_timeout(均建议设为86400),并严格置于location块内,同时必须配置proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade",并禁用proxy_buffering和proxy_cache。

Linux 下为 Nginx 的 WebSocket 代理单独配置合理超时参数,核心不是“延长连接总时长”,而是让 Nginx 正确识别并维持已升级的长连接通道——关键在 proxy_read_timeout 和 proxy_send_timeout 的协同设置,且必须配合协议升级头生效。
超时值要匹配心跳节奏,不能只堆大数字
WebSocket 连接空闲时依赖心跳帧保活。若心跳间隔为 30 秒,但 proxy_read_timeout 仅设为 60,网络抖动或后端延迟 1–2 秒就可能触发断连。建议按以下逻辑设定:
- 心跳设为 25 秒、45 秒或 55 秒(避开 60 秒倍数,防共振断连)
-
proxy_read_timeout≥ 心跳间隔 × 2.5(例如心跳 30 秒 → 至少设 75,推荐 300–86400) -
proxy_send_timeout与proxy_read_timeout设为相同值(如 86400),避免后端发 pong 或大消息中途被掐断 - 不要设为 0:Nginx 不支持,会退回到默认 60 秒
超时配置必须放在 location 块内才生效
这些参数对普通 HTTP 接口和 WebSocket 行为不同,不能写在 http 或 server 块顶层。必须嵌入匹配 WebSocket 路径的 location 中,例如:
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
proxy_send_timeout 86400;
}
关掉缓冲和缓存,否则超时再大也白搭
WebSocket 是帧流式通信,Nginx 默认开启的缓冲和缓存会截断、延迟甚至丢弃心跳包:
- 必须加
proxy_buffering off;(禁用响应缓冲,确保帧实时透传) - 必须加
proxy_cache off;(防止 Upgrade 请求被缓存返回 200) - 可选加
proxy_cache_bypass $http_upgrade;(进一步绕过缓存判断) - 不要配
gzip on或gzip_types包含application/json等类型,压缩会破坏帧边界
HTTPS 下 wss 连接还要检查 SSL 配置是否完整
wss 协议要求 TLS 层握手成功,Nginx 才能进入 HTTP 升级阶段:
- 确保
server块监听443 ssl,而非仅 80 端口 - 证书路径正确、域名匹配,且启用
ssl_protocols TLSv1.2 TLSv1.3 - 禁用 HTTP/2:
listen 443 ssl http2会导致 Upgrade 失败,应改为listen 443 ssl - 用
curl -i -k -H "Connection: upgrade" -H "Upgrade: websocket" https://your.com/ws测试,响应必须含HTTP/1.1 101 Switching Protocols


















