要让Nginx稳定代理高频股票行情WebSocket流,核心是透传Upgrade/Connection头、设proxy_http_version 1.1、将proxy_read_timeout和proxy_send_timeout均设为86400、关闭proxy_buffering,并确保后端每15–30秒发送心跳帧。

要让 Nginx 稳定代理高频股票行情的 WebSocket 流,核心是解决连接保持、超时控制和反向代理透传问题。WebSocket 本质是 HTTP 升级协议,Nginx 默认会关闭长连接,必须显式配置才能维持升级后的 TCP 连接不被中断。
启用 WebSocket 协议透传
Nginx 不会自动识别并透传 WebSocket 的 Upgrade 和 Connection 头,需手动添加。否则后端收不到升级请求,连接降级为普通 HTTP,无法建立 WebSocket。
- 在
location块中添加以下三行头信息透传:
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
注意:$http_upgrade 是 Nginx 内置变量,值来自客户端原始请求头;"upgrade" 必须加引号(避免被解析为 off);proxy_http_version 1.1 是强制要求,因为 HTTP/1.0 不支持 Upgrade 机制。
调优超时与连接参数
高频行情流通常持续数小时甚至全天,Nginx 默认 60 秒超时会直接断连。需延长所有相关超时,并禁用缓冲以降低延迟。
-
proxy_read_timeout 86400;:设置从后端读取响应的最大等待时间(单位秒),建议设为 24 小时(86400)或更长 -
proxy_send_timeout 86400;:设置向后端发送请求的最大等待时间 -
proxy_buffering off;:关闭缓冲,避免 Nginx 缓存行情帧导致延迟升高 -
proxy_buffer_size 4k;和proxy_buffers 8 4k;可保留默认,但若行情消息极小(如二进制 tick),可进一步调小
确保后端服务能稳定承载连接
Nginx 本身不处理 WebSocket 消息内容,只做转发。真正压力在后端服务(如基于 Node.js / Python / Go 的行情网关)。Nginx 配置再好,后端若未正确处理 ping/pong、连接复用或心跳,仍会频繁断连。
- 后端必须响应
Ping帧并主动发Pong,否则 Nginx 在proxy_read_timeout后会关闭空闲连接 - 建议后端每 15–30 秒发一次心跳(文本帧或 pong),Nginx 不拦截也不修改,原样透传
- 检查后端 WebSocket 库是否支持并发万级连接(如 ws in Node.js、websockets in Python、gorilla/websocket in Go)
可选:添加简单健康检查与日志追踪
高频场景下,连接异常需快速定位是 Nginx 中断、网络抖动还是后端挂起。
- 开启 access_log 并记录
$status和$upstream_response_time,重点关注 101(Switching Protocols)是否稳定出现 - 用
log_format加入$http_upgrade和$http_connection,确认升级头未被篡改 - 不建议在生产环境用
health_check(Nginx Plus 功能),开源版可用简单 TCP 检查或配合上游 keepalive











