要让 nginx 正确代理 websocket,必须配置 proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade 和 proxy_set_header connection "upgrade",并设置 proxy_read_timeout 和 proxy_send_timeout 为较大值(如 86400),确保后端支持 101 响应。

要让 Nginx 正确代理 WebSocket,核心是显式设置升级请求头和禁用 HTTP/1.0 缓存行为,否则连接会在握手阶段降级为普通 HTTP,导致 101 Switching Protocols 失败。
必须配置的三个关键 Header
WebSocket 建立依赖客户端发起 Upgrade: websocket 请求,Nginx 默认不透传该头,也不处理升级逻辑。需在 location 块中显式声明:
- proxy_http_version 1.1:强制使用 HTTP/1.1(WebSocket 升级要求)
-
proxy_set_header Upgrade $http_upgrade:将客户端的
Upgrade头原样转发(值通常为websocket) - proxy_set_header Connection "upgrade":告知后端这是升级连接,不是普通长连接
避免超时中断长连接
WebSocket 是长生命周期连接,Nginx 默认的 proxy_read_timeout(60 秒)会主动断开空闲连接。应设为较大值或 0(表示不限制):
- proxy_read_timeout 86400:设为 24 小时,覆盖大多数业务场景
- proxy_send_timeout 86400:同理,防止服务端发包间隔过长被断连
- 注意:
keepalive_timeout影响的是 Nginx 与客户端的 TCP 连接复用,对 WebSocket 无实质作用,可不调
后端服务需兼容升级响应
Nginx 只负责透传和协议协商,最终是否完成 WebSocket 握手,取决于后端是否正确响应 101 Switching Protocols 并切换为 WebSocket 帧通信:
- Node.js(ws 库)、Python(websockets)、Java(Spring WebSocket)等主流框架默认支持,无需额外配置
- 若后端是自研 HTTP 服务,需检查是否解析了
Sec-WebSocket-Key并返回标准响应头(如Sec-WebSocket-Accept) - 浏览器控制台 Network 面板中,WebSocket 请求状态码应为
101,而非200或502
常见故障排查点
连接失败时优先检查这几项:
- 浏览器开发者工具里 WebSocket 请求是否显示
Failed to load response data—— 很可能是 Nginx 返回了 502 或 504,说明未成功转发到后端 - 用
curl -i -H "Connection: upgrade" -H "Upgrade: websocket" http://your-domain/ws模拟握手,看是否返回101 - Nginx error log 中出现
upstream prematurely closed connection,通常是后端进程崩溃或未监听对应端口 - SSL 环境下确保 WSS 使用
wss://,且 Nginx 的listen 443 ssl已启用,HTTP/2 不影响 WebSocket










