Nginx代理WebSocket需配置协议升级头、调大超时、关闭缓冲及启用tcp_nodelay:proxy_http_version 1.1;Upgrade与Connection头;proxy_read/send_timeout≥45s;proxy_buffering off;tcp_nodelay on;wss需传X-Forwarded-Proto。

直接配对关键几项就能让 Nginx 正确代理 WebSocket,不需要额外模块或升级内核。核心是让握手请求不被拦截、长连接不被误关。
必须设置的协议升级头
WebSocket 握手依赖 HTTP/1.1 的 Upgrade 机制,Nginx 默认不透传相关头部,必须显式声明:
- proxy_http_version 1.1:硬性要求,不能省略或设为 1.0
- proxy_set_header Upgrade $http_upgrade:用变量动态传递,兼容 WebSocket、MQTT 等多种升级协议
-
proxy_set_header Connection "upgrade":注意是固定字符串 "upgrade",不是
$connection_upgrade(后者在非升级请求时为空,会变成Connection: close)
超时与缓冲必须调大调关
默认值专为短连接设计,会主动切断 WebSocket 长连接:
- proxy_read_timeout 至少设为 86400(24 小时),若后端每 30 秒发一次 ping,可设为 45,但绝不能 ≤30
- proxy_send_timeout 建议同步设为相同值,避免大消息分片中途被中断
- proxy_buffering off:禁用响应缓冲,防止多个 TEXT 帧被合并发送,造成延迟或粘包
- tcp_nodelay on:绕过 Nagle 算法,小数据(如心跳、光标移动)立即发出
wss 场景要补传协议类型
当代理 wss:// 请求时,后端需要知道原始协议是 HTTPS,否则可能误生成 http:// 链接:
- 添加 proxy_set_header X-Forwarded-Proto $scheme
- 确保基础 HTTPS 配置已就绪:SSL 证书、
listen 443 ssl、TLS 版本与加密套件合规 - wss 流量经 Nginx 解密后转为 ws 转发给后端,后端无需再处理 TLS
location 配置示例(含注释)
假设后端 WebSocket 服务运行在 127.0.0.1:8080,对外路径为 /ws:
location /ws {
proxy_pass http://127.0.0.1:8080;
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;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400;
proxy_send_timeout 86400;
proxy_buffering off;
tcp_nodelay on;
}


















