关键在于缓冲区与响应结构及传输节奏匹配:响应头用proxy_buffer_size(建议16k–32k),响应体用proxy_buffers(按场景设8–16个256k/512k),busy缓冲区设为单buffer的1.5–2倍,禁用临时文件,同步收紧超时与keepalive等参数。

关键不是堆内存,而是让缓冲区匹配响应结构和传输节奏——头与体分开管、忙与闲分清楚、磁盘尽量不碰。
响应头和响应体必须分开配置
响应头(Header)走 proxy_buffer_size,只存 Set-Cookie、Location、JWT 等元数据;响应体(Body)走 proxy_buffers,负责 HTML、JSON、文件等实际内容。两者路径不同,混着调会出错。
- proxy_buffer_size 建议设为 16k 或 32k:默认 4k 容易触发 “upstream sent too big header” 错误,尤其后端带多层鉴权头或长 Cookie 时
-
proxy_buffers 按典型响应大小定总量:小页面/接口用
8 256k(2MB),大报表或 SSR 页面用16 256k(4MB),导出类服务可到16 512k(8MB)
busy 缓冲区要留够“接力空间”
Nginx 边发边收时,正在往客户端发送的那部分缓冲区不能被上游覆盖——这部分由 proxy_busy_buffers_size 控制。它太小,上游写入会卡住;太大,空闲缓冲不够,高并发下容易争抢。
- 该值必须 ≤ proxy_buffers 总容量,且 ≥ proxy_buffer_size
- 推荐设为单个 buffer 大小的 1.5–2 倍:例如
proxy_buffers 8 256k,就设proxy_busy_buffers_size 512k - 避免沿用默认的 8k–16k,否则 Nginx 很快停止从后端读数据,导致 upstream timed out
临时文件是吞吐杀手,能禁则禁
一旦响应超出内存缓冲总和,Nginx 会写临时文件到磁盘(/var/lib/nginx/proxy/),I/O 成为瓶颈。除非内存严重受限,否则应优先规避落盘。
- 确认 proxy_max_temp_file_size 不为 0(除非你 100% 确保不会超限),但也不宜过大(如超过 1G),防止单次异常响应耗尽磁盘
- 若业务响应大小稳定,可设为
0并监控 “upstream sent too big response” 日志,及时发现超限请求 - 配合增大 proxy_buffers,让常见响应完全驻留内存,比依赖磁盘更可靠
配套参数必须同步收紧
缓冲再合理,如果超时或连接策略没跟上,照样卡在半路。
-
proxy_read_timeout 设为最长接口耗时上浮 20%,比如后端最慢响应 90 秒,这里就配
120 - proxy_send_timeout 建议不低于 30s,尤其面向弱网或移动端客户端
- 启用 upstream keepalive(如
keepalive 64)并配proxy_http_version 1.1和proxy_set_header Connection '',避免反复建连拖垮吞吐 - 加 proxy_ignore_client_abort on,客户端断连时主动中断后端,不白忙











