nginx代理websocket需在具体location中配置三项协议升级(proxy_http_version 1.1、upgrade头透传、connection设为"upgrade")和两项保活控制(禁用缓冲、延长读写超时),路径须精准匹配且不可置于根location中。

要在 Nginx 的 location 块中正确代理 WebSocket 协议的长连接,关键不是加一堆可选参数,而是确保三项协议升级动作和两项连接保活控制全部到位——缺一不可,且必须写在具体匹配路径的 location 里。
必须透传的两个升级头
WebSocket 握手依赖 HTTP/1.1 的 Upgrade 和 Connection 这两个逐跳头,Nginx 默认会丢弃它们,必须显式设置:
-
proxy_http_version 1.1;—— 强制使用 HTTP/1.1(HTTP/1.0 不支持 Upgrade) -
proxy_set_header Upgrade $http_upgrade;—— 把客户端发来的Upgrade: websocket原样转发给后端 -
proxy_set_header Connection "upgrade";—— 注意是固定字符串 "upgrade",不是变量;这是告诉 Nginx 执行协议切换,而不是关闭连接
必须禁用缓冲并延长超时
默认配置会让 WebSocket 消息被缓存、截断或连接被误杀,需针对性关闭:
-
proxy_buffering off;—— 防止帧被暂存导致粘包或延迟 -
proxy_read_timeout 86400;—— 设置读超时为 24 小时(或至少 3600),避免空闲连接被主动断开 -
proxy_send_timeout 86400;—— 同步调大发送超时,保障服务端推送不中断
路径匹配要精准,别用兜底 location
WebSocket 流量必须走专用路径,不能混在 location / { } 里:
- 用明确前缀匹配,例如
location /ws { ... }或location /api/ws { ... } - 确保前端
new WebSocket("wss://domain.com/ws")中的路径与之完全一致 - 可加校验增强健壮性:
if ($http_upgrade != "websocket") { return 403; }
HTTPS 场景下额外注意点
若走 wss,Nginx 需终止 SSL,并透传协议信息:
- 443 server 块中已配置
ssl_certificate和ssl_certificate_key - 补充
proxy_set_header X-Forwarded-Proto $scheme;,方便后端识别 HTTPS -
proxy_pass目标仍用http://(Nginx 解密后转 HTTP 给后端),不要写成https://











