要让 nginx 稳定代理 websocket,关键是透传 upgrade 和 connection 头、关闭 proxy_buffering、设 proxy_read_timeout 和 proxy_send_timeout ≥ 后端心跳间隔、启用 tcp_nodelay on,并禁用 proxy_cache;缺一即导致握手失败或静默断连。

要让 Nginx 代理 WebSocket 时连接不被误杀、保持稳定,关键不是“延长超时”这么简单,而是精准匹配 WebSocket 的通信逻辑:它本质是升级后的长连接,不是普通 HTTP 请求。Nginx 默认按短连接处理,所以必须显式绕过默认行为。
必须透传协议升级头,握手才能成功
WebSocket 握手是 HTTP 升级过程,Nginx 若不参与或过滤关键头部,后端收不到信号,直接返回 200,前端报错 “Unexpected response code: 200”。
-
proxy_http_version 1.1;—— 强制使用 HTTP/1.1(HTTP/1.0 不支持 Upgrade) -
proxy_set_header Upgrade $http_upgrade;—— 用变量透传客户端原始值(如websocket或自定义协议),不能硬写"websocket" -
proxy_set_header Connection "upgrade";—— 注意双引号和小写upgrade,这是逐跳头,不能用$http_connection
超时设置要覆盖心跳周期,而非盲目设大proxy_read_timeout 控制 Nginx 等待后端数据的空闲时间,对已升级的 WebSocket 连接同样生效。默认 60 秒,正好导致“准时断连”。
- 设为
86400(24 小时)是常见起点,但真正应 ≥ 后端最大允许空闲时长 - 若后端每 30 秒发一次 ping,建议设为至少 60 秒;若心跳间隔可变,取最大值 × 2 更稳妥
- 同步设置
proxy_send_timeout 86400,避免大消息分片发送中途被掐断
关闭缓冲,确保帧实时透传
WebSocket 数据以帧(frame)流形式双向传输,Nginx 默认开启的响应缓冲会攒帧、延迟、甚至粘包。
-
proxy_buffering off;—— 必须在具体location块中关闭(如/ws/),不可放全局 - 可选加
proxy_buffer_size 16k和proxy_busy_buffers_size 32k,防止单次接收过大帧阻塞 - 显式加
proxy_cache off;,避免 Upgrade 请求被缓存命中返回 200
路径与 HTTPS 配置要严格匹配
-
location必须精确或前缀匹配 WebSocket 路径(如location /ws/ { ... }),避免 rewrite 改写路径或请求头 - wss 场景下,Nginx SSL 配置需完整:证书、密钥、
ssl_protocols TLSv1.2+,且仍需proxy_http_version 1.1(HTTP/2 不支持 Upgrade)
不复杂但容易忽略











