nginx 通过禁用 proxy_buffering off 实现后端异步响应(如 sse)的流式透传,需配合 proxy_http_version 1.1、proxy_set_header connection ''、chunked_transfer_encoding on、proxy_cache off 及延长 proxy_read_timeout 等配置,确保边收边发、长连接不中断。

Nginx 本身不执行业务逻辑,也不直接“处理”异步任务,但它能高效地代理、转发和流式传递后端发起的异步响应(如 SSE、长轮询、分块传输编码 chunked responses),关键在于禁用缓冲、启用流式透传,并避免阻塞事件循环。
关闭代理缓冲,实现响应流式透传
默认情况下,Nginx 会缓存后端响应再整体返回,这会破坏异步响应的实时性(比如消息推送、进度流)。需显式关闭缓冲:
- proxy_buffering off; —— 禁用响应体缓冲,让数据边收边发
- proxy_http_version 1.1; —— 强制使用 HTTP/1.1,支持 chunked 编码
- proxy_set_header Connection ''; —— 清除 Connection 头,避免中间设备干扰 keepalive
- chunked_transfer_encoding on;(在 location 或 http 块中)—— 显式允许分块传输(部分旧版 Nginx 需要)
适配后端异步响应头与连接保持
后端若采用 Server-Sent Events(SSE)或自定义流协议,需确保响应头与连接行为被正确透传:
- 后端应返回 Content-Type: text/event-stream(SSE)或 text/plain(自定义流),Nginx 默认不修改 Content-Type,无需额外配置
- 设置 proxy_cache off; 和 proxy_cache_bypass 1;,防止缓存截断流式响应
- 启用 proxy_read_timeout 300;(或更长),避免 Nginx 因无数据到达而主动断连;该值应略大于后端心跳或最大空闲间隔
- 建议开启 keepalive 32;(upstream 中),复用到后端的连接,减少握手开销
避免隐式同步操作干扰事件循环
某些配置看似无关,实则会中断流式代理的异步流水线:
- 禁用 auth_request 指令——它强制同步等待子请求完成,会卡住整个流通道
- 避免在该 location 中使用复杂正则 rewrite 或嵌套 if,增加事件处理延迟
- 日志写入改用缓冲:添加 access_log /path/log.log buffer=64k flush=5s;,防止磁盘 I/O 拖慢 worker
- 不要搭配 proxy_buffering off 却遗漏超时设置,否则可能因后端挂起导致连接长期滞留
可选:配合 OpenResty 实现动态流控与增强处理
若需在流式响应中注入元数据、做鉴权透传或聚合多个后端流,基础 Nginx 不足,可升级至 OpenResty:
- 用 body_filter_by_lua_block 对每个 chunk 做轻量加工(注意:不可发起 cosocket 请求)
- 用 header_filter_by_lua_block 动态添加响应头(如 X-Stream-ID)
- 真正需要异步操作(如调用鉴权服务后再放行流)时,应绕过内置 proxy_pass,用 lua-resty-http 手动实现流式代理











