nginx 默认支持流式代理,需禁用请求体缓存(如 proxy_request_buffering off)、关闭缓冲(proxy_buffering off)、启用 http/1.1(proxy_http_version 1.1),并配置合理超时与后端适配。

Nginx 默认支持对请求体的流式(streaming)代理处理,无需额外开启特殊模块,但需避免触发缓冲行为 —— 关键在于禁用请求体缓存、合理配置超时与缓冲区,并确保后端服务能持续接收分块数据。
禁用请求体缓冲(核心步骤)
默认情况下,Nginx 会将整个请求体读入内存或临时文件后再转发,这破坏流式特性。需显式关闭:
-
client_body_buffer_size 0;:设为 0 表示不使用内存缓冲区(注意:仅在
http或server块中生效,且要求 Nginx ≥ 1.19.5) - client_max_body_size 0;:禁用请求体大小限制(若业务允许)
-
client_body_in_file_only off;(默认值,勿设为
on) - client_body_in_single_buffer off;(默认值,避免强制单缓冲)
启用流式代理关键指令
确保代理层不等待完整请求体,立即开始转发:
-
proxy_buffering off;:关闭响应缓冲,也间接影响请求体流式传递(尤其配合
proxy_http_version 1.1) - proxy_http_version 1.1;:启用 HTTP/1.1,支持 chunked 编码和持久连接,是流式传输基础
- proxy_request_buffering off;:Nginx ≥ 1.7.11 引入,彻底禁用请求体缓存(推荐优先使用此指令)
-
proxy_set_header Transfer-Encoding "";:清除客户端可能携带的
Transfer-Encoding: chunked,由 Nginx 按需重写(仅当后端不兼容分块时谨慎使用)
适配后端与超时控制
流式代理要求后端能边收边处理,同时 Nginx 需保持连接稳定:
- proxy_send_timeout 300;:设置向后端发送请求体的超时(如上传大文件或长连接流),避免因后端处理慢导致 Nginx 中断连接
- proxy_read_timeout 300;:设置等待后端响应的超时(适用于后端边处理边返回响应流)
- 确保后端服务(如 Node.js、Python FastAPI、Go HTTP server)未自行缓冲请求体 —— 例如在 Express 中使用
req.pipe(),在 FastAPI 中用await request.stream() - 若后端基于 HTTP/1.0 或不支持持久连接,流式效果受限,建议统一升级至 HTTP/1.1 或 HTTP/2
验证是否真正流式转发
可通过日志与抓包确认行为是否符合预期:
- 在
log_format中加入$request_length和$body_bytes_sent,观察大请求下是否出现“边收边发”的日志节奏 - 用
tcpdump或 Wireshark 抓包,检查 Nginx 到后端的 TCP 流是否在客户端尚未发完时已开始传输 - 在 upstream 中配置
keepalive 32;并启用proxy_http_version 1.1;,复用连接降低流式开销 - 避免使用
proxy_cache或proxy_store,它们强制完整读取请求体











