Nginx 代理 WebSocket 需显式配置 HTTP/1.1、Upgrade/Connection 头及长超时(如 proxy_read_timeout 86400),并合理设置 upstream keepalive 与健康检查,否则连接会被默认超时或头部缺失中断。

Nginx 默认会关闭后端连接(尤其是非 HTTP/1.1 或超时场景),导致 WebSocket 连接在代理过程中被意外中断。要让 Nginx 正确转发 WebSocket 流量,关键不是“开启某个开关”,而是**显式设置与 WebSocket 协议行为匹配的 HTTP 头部和超时参数**。
必须配置的 WebSocket 代理头
WebSocket 建立依赖标准 HTTP Upgrade 流程,Nginx 必须透传相关头部,否则后端无法识别升级请求:
- proxy_http_version 1.1:强制使用 HTTP/1.1(WebSocket 升级机制要求)
- proxy_set_header Upgrade $http_upgrade:将客户端的 Upgrade: websocket 头原样传给后端
- proxy_set_header Connection "upgrade":覆盖默认的 Connection: close,告诉 Nginx 不要关闭连接
防止连接被意外关闭的超时设置
WebSocket 是长连接,Nginx 默认的 60 秒超时会直接断开空闲连接。需延长以下三项:
- proxy_read_timeout 86400:设置 Nginx 等待后端响应的最大时间(单位秒),建议设为 24 小时或更长
- proxy_send_timeout 86400:控制 Nginx 向后端发送请求的超时,同样需延长
- keepalive_timeout 86400:保持客户端到 Nginx 的连接存活时间(可选,但推荐一致)
负载均衡配置示例(含健康检查)
在 upstream 块中启用简单健康检查,避免将请求转发到已断连的 WebSocket 后端:
upstream ws_backend {
server 192.168.1.10:8080 max_fails=2 fail_timeout=10s;
server 192.168.1.11:8080 max_fails=2 fail_timeout=10s;
keepalive 32; # 保持到后端的空闲连接数
}
<p>server {
listen 80;
location /ws/ {
proxy_pass <a href="https://www.php.cn/link/32842e5dcc326280949f03bf9ae8f784">https://www.php.cn/link/32842e5dcc326280949f03bf9ae8f784</a>;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;</p><pre class="brush:php;toolbar:false;"> proxy_read_timeout 86400;
proxy_send_timeout 86400;
}}
验证是否生效
部署后可通过浏览器开发者工具查看 WebSocket 连接的响应头:
- 响应状态码应为 101 Switching Protocols
- 响应头中应包含 Upgrade: websocket 和 Connection: upgrade
- 若返回 502/504 或连接秒断,大概率是 Upgrade 头未透传或 proxy_read_timeout 过短
不复杂但容易忽略


















