websocket频繁断开主因是proxy_read_timeout默认60秒过短且upgrade/connection头未透传,须在location块中配置proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade、proxy_set_header connection "upgrade"、proxy_read_timeout≥3600、proxy_buffering off及gzip off。

WebSocket 连接在 Nginx 后面频繁断开,基本就是 proxy_read_timeout 没调大,或者三行关键升级头缺失——不是后端问题,也不是前端代码写错了。
为什么改了 proxy_read_timeout 还断连
只改超时时间远远不够。Nginx 默认用 HTTP/1.0 转发请求,后端根本收不到 Upgrade: websocket 头,握手就失败,返回 200 或 502,前端连 101 Switching Protocols 都看不到。
-
proxy_http_version 1.1必须加:HTTP/1.0 不支持协议升级机制 -
proxy_set_header Upgrade $http_upgrade必须加:把客户端带的原始值(通常是websocket)透传过去 -
proxy_set_header Connection "upgrade"必须加:注意是双引号包裹的字面量"upgrade",不是$http_connection,也不是keep-alive - 这三行必须写在匹配 WebSocket 路径的
location块里,写在server或http块顶层无效
proxy_read_timeout 设多少才安全
它控制 Nginx 等待后端数据的最长时间。WebSocket 空闲时只靠心跳维持,一旦超时,Nginx 就直接断 TCP 连接,前端触发 close 事件,错误码常为 1006。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 默认值是
60,只要 60 秒没收到后端数据,连接就被杀掉 - 建议设为
proxy_read_timeout 86400(24 小时),或至少 ≥ 客户端心跳间隔 × 3(例如心跳 30 秒,这里至少设 90) -
proxy_send_timeout 86400要同步设置,防止向后端发送大消息时被中断 - 别信
proxy_read_timeout 0能“永不超时”——部分 Nginx 版本行为未定义,实际可能失效或崩溃
容易被忽略的缓冲和压缩干扰
WebSocket 是流式双向通信,Nginx 默认开启的缓冲和压缩会破坏帧结构,尤其在推送密集或中间有云 LB 的场景下,连接会被静默切断。
-
proxy_buffering off:必须放在具体location块中(如/ws/),全局关掉会影响其他 HTTP 接口 -
gzip off:或确保gzip_types不包含application/json、text/plain等 WebSocket 常用 MIME 类型 -
proxy_cache off:避免缓存响应干扰实时性 -
proxy_buffer_size 16k和proxy_busy_buffers_size 32k可选加,防止单次接收过大包阻塞连接
最常踩的坑是把配置写错位置、漏引号、或只改 timeout 不配 upgrade 头——结果日志里全是 upstream prematurely closed connection,但问题根本不在后端。










