Nginx代理WebSocket需显式配置:设proxy_http_version 1.1、透传Upgrade和Connection头、禁用proxy_buffering、设proxy_read_timeout和proxy_send_timeout为86400秒,并确保后端正确响应101状态码。

Nginx 默认会关闭后端的长连接,WebSocket 依赖持续打开的 TCP 连接,因此必须显式配置才能正确代理。关键在于设置特定的 HTTP 头部、禁用缓冲和调整超时时间。
启用 WebSocket 协议升级支持
WebSocket 建立前需通过 HTTP Upgrade 请求切换协议,Nginx 必须透传 Upgrade 和 Connection 头部,否则握手失败。
- 在 location 块中添加:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; -
$http_upgrade是 Nginx 内置变量,自动获取客户端请求中的 Upgrade 头值(通常是 "websocket") -
Connection "upgrade"显式告诉上游服务器允许协议升级,不能写成$http_connection,否则可能被过滤
关闭响应缓冲与保持连接
WebSocket 数据是双向实时流,若开启缓冲或过早关闭连接,会导致消息延迟或中断。
- 禁用缓冲:
proxy_buffering off; - 保持长连接(可选但推荐):
proxy_cache off;
proxy_redirect off; - 避免 Nginx 因空闲超时断连:
proxy_read_timeout 86400;(设为大值,如 24 小时)
proxy_send_timeout 86400;
后端服务需兼容 Upgrade 请求
Nginx 只负责转发,后端应用(如 Node.js、Spring Boot)必须正确处理 Upgrade: websocket 请求,返回 101 状态码并切换协议。
- 常见错误:后端未监听 Upgrade 头,直接返回 200 或 404,导致前端报错 “Error during WebSocket handshake”
- 验证方式:用 curl 模拟升级请求:
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" http://your-domain.com/ws - 成功响应应包含:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
SSL 场景下注意 wss 协议一致性
前端使用 wss:// 时,Nginx 需启用 HTTPS,并确保证书有效;同时后端 WebSocket 地址也应为 wss:// 或内部 ws://(若反向代理已解密)。
- HTTPS 配置中无需额外改 WebSocket 相关指令,复用上述 proxy 设置即可
- 避免混合协议:前端 wss → Nginx HTTPS → 后端 ws(明文),这是安全且常见做法
- 若后端本身支持 TLS,Nginx 可配置
proxy_pass https://backend;,但需确保证书信任链完整


















