nginx长轮询需延长proxy_read_timeout等超时参数、关闭proxy_buffering以实现流式传输,并可启用upstream keepalive保持连接活跃。

处理 Nginx 反向代理中的长轮询请求,核心是避免连接被意外中断或超时关闭,确保后端服务有足够时间维持连接、等待事件触发并返回响应。关键在于调整超时参数、禁用缓冲,并保持连接活跃。
调整超时时间防止连接被提前关闭
Nginx 默认的超时值(如 proxy_read_timeout)通常只有 60 秒,而长轮询可能需要数分钟甚至更久。必须显式延长相关超时参数:
- proxy_read_timeout:设置为长轮询最大等待时长(例如 300 秒),表示 Nginx 等待后端返回响应的最长时间
- proxy_send_timeout:设为相近值,防止 Nginx 在发送响应过程中因空闲过久断开连接
- proxy_connect_timeout:保持默认或略增(如 10 秒),仅影响初始建连,对长轮询影响较小
禁用响应缓冲以支持流式传输
长轮询通常是一次性返回数据,但 Nginx 默认启用 proxy_buffering on,会缓存后端响应直到收完整个 body 才转发给客户端——这会破坏长轮询“有数据即发”的语义,造成延迟甚至超时。
应关闭缓冲并配置流式行为:
- 设置 proxy_buffering off
- 搭配 proxy_buffer_size 4k(可选,保证首块响应头不被截断)
- 若需兼容 HTTP/1.0 客户端,可加 proxy_http_version 1.1 和 proxy_set_header Connection '',避免连接被降级关闭
保持 TCP 连接活跃(可选但推荐)
某些网络中间件(如负载均衡器、NAT 设备)会在空闲一段时间后主动清理连接。可在 upstream 中启用 keepalive,复用连接并减少握手开销:
- 在
upstream块中添加 keepalive 32(保持最多 32 个空闲长连接) - 后端 server 需支持 HTTP keep-alive,并正确设置
Connection: keep-alive响应头 - 对应地,在 location 中添加 proxy_http_version 1.1 和 proxy_set_header Connection ''
验证与调试要点
部署后建议通过 curl 或浏览器开发者工具观察实际行为:
- 检查响应头是否含
Transfer-Encoding: chunked或明确的Content-Length,确认未被缓冲截断 - 用
curl -v http://your-domain/longpoll观察连接是否持续、响应是否及时返回 - 查看 Nginx error log,过滤
upstream timed out或client closed connection类错误 - 确认后端日志中请求生命周期与 Nginx 配置超时匹配,排除后端自身提前断连
不复杂但容易忽略的是:所有 timeout 参数必须协同调整,且 proxy_buffering 必须关闭。只要后端真正按长轮询逻辑阻塞等待、不主动关闭连接,Nginx 就能稳定透传。











