proxy_busy_buffers_size的核心作用是控制nginx已收完但未发完给客户端的数据内存上限,作为背压闸门协同proxy_buffers使用,仅在proxy_buffering on时生效,且须满足不低于单buffer大小、不超过buffers总量的约束。

proxy_busy_buffers_size 的核心作用是控制 Nginx “已从后端收完、但还没发完给客户端”这部分数据所占用的内存上限。它不是总缓存大小,也不是响应头缓冲区,而是一道关键的“背压闸门”:设小了,Nginx 会过早停读上游,导致后端写阻塞;设大了,可能让大量内存被慢客户端长期占用,引发 OOM 或吞吐下降。
它管什么、不管什么
这个参数只在 proxy_buffering on; 时生效,且必须与 proxy_buffers 协同使用:
- ✅ 管的是“已发出、未确认”的 body 数据上限(比如客户端下载卡顿,数据卡在发送途中)
- ✅ 是从 proxy_buffers 总量里划出的“忙区”配额,不是独立内存池
- ❌ 不管响应头——那是 proxy_buffer_size 的职责(通常 4k–32k)
- ❌ 不管落盘行为——那是 proxy_max_temp_file_size 和 proxy_temp_path 控制的
- ❌ 关闭 buffering 后(如流式日志、SSE),它完全不参与逻辑
怎么设才合理
推荐值 = proxy_buffers 总大小的 1/4 至 1/2,同时满足两个硬约束:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 不低于单个 buffer 大小(例如
proxy_buffers 8 128k;→ 单块 128k,busy 值至少 128k) - 不超过 proxy_buffers 总量(
proxy_buffers 16 256k;总 4MB,busy 最大设 4m;超限则nginx -t报错)
常见组合示例:
- SSR 首屏 HTML(约 100KB):
proxy_buffers 8 128k;→proxy_busy_buffers_size 128k;或256k; - 大 JSON/API 导出(2–5MB):
proxy_buffers 16 256k;→proxy_busy_buffers_size 1m;或2m; - 视频/安装包回源(需缓冲):
proxy_buffers 8 512k;→proxy_busy_buffers_size 512k;~1m;
必须配合的关键配置
单独调这个参数几乎无效,要联动以下几项:
-
显式开启 buffering:location 块内写
proxy_buffering on;,避免被上级或默认覆盖 -
检查响应头是否生效:用
curl -I请求,看到Content-Length说明缓冲完整工作;若出现X-Accel-Buffering: no,说明 buffering 实际已关 -
设好超时:搭配
proxy_read_timeout 300;、send_timeout 60;,让慢连接及时释放 busy 缓冲 -
响应头大的场景:单独调高
proxy_buffer_size 16k;或32k;,不影响 busy 值设置
验证是否真起效
reload 后别只看服务起来没,重点观察运行态信号:
- error log 是否还有
upstream response is buffered to a temporary file?频繁出现说明 busy 区或总量仍不足 - access log 中
$upstream_response_time和$request_time差值是否明显缩小?差值大 = 数据积压在 busy 区没及时发出 - 用
strace -p $(pgrep nginx) -e trace=write看是否有大量write() = -1 EAGAIN,这是 busy 区满、发不出去的直接证据










