scgi_buffers配置需按scgi接口响应特征设定:普通json/api用8 128k,带长header网关需scgi_buffer_size 16k且单块≥16k,避免502错误。

scgi_buffers 的配置逻辑和 proxy_buffers 高度一致,但专用于 SCGI 协议后端(如 Python 的 uWSGI 或自研 SCGI 服务)。它不直接控制 page fault,而是通过稳定单请求缓冲区分配、避免临时文件落盘、抑制 worker 进程 RSS 突增,来间接降低内核内存压力。
按接口响应特征设 buffer 数量与单块大小
SCGI 接口通常为轻量级网关(如鉴权、路由、数据聚合),响应体集中在 1–200KB 区间。盲目沿用默认值(scgi_buffers 8 4k)会导致小包频繁切 buffer,加剧 slab 分配抖动和 minor page fault。
- 普通 JSON/API 响应(平均 50–120KB):建议 scgi_buffers 8 128k(总量 1MB),覆盖 95% 场景且单请求 RSS 增长可控
- 带长 Header 的网关(含 JWT、多层 TraceID、自定义元数据):需同步调大 scgi_buffer_size 16k(必须小于单块大小,如 128k),否则触发 upstream sent too big header 502 错误
- 高频小包心跳或状态上报(scgi_buffers 16 8k(总量 128KB),减少 buffer 切换频次,比 4k 更适配现代 TCP MSS
避免 buffer 总量失控引发 RSS 暴涨
每个活跃 SCGI 请求独占一组 buffer,worker 进程总内存占用 ≈ 并发连接数 × buffer 总量。若后端响应偶发超大(如调试日志 dump),单请求吃掉数 MB,高并发下极易触发 major page fault 或 swap。
- 禁止使用 scgi_buffers 32 1m 类配置——单请求理论峰值达 32MB,20 个并发即可压垮 1GB 内存机器
- 对非流式接口,总量建议封顶在 2–4MB/worker;若后端支持流式输出(如 chunked Transfer-Encoding),可设 scgi_buffering off 彻底绕过缓冲,由客户端直连后端
- 配合 limit_conn 控制每 IP 并发上限(如
limit_conn addr 50;),从源头约束 buffer 总需求
验证是否真正生效
reload 后不能只看服务是否运行,关键看运行态行为:
- error log 出现 upstream buffer is too small 或 an upstream response is buffered to a temporary file → 缓冲不足,需增大数量或单块大小
- 监控
nginx_http_scgi_buffering指标中 disk_writes 持续上升 → 频繁落盘,说明内存缓冲设计偏低,page cache 被反复污染 - 开启
error_log /path/to/error.log debug;(仅测试环境)可观察 using scgi buffer #N 日志,确认 buffer 复用率是否健康
与 proxy_buffering 的区别要分清
scgi_buffers 仅管理 SCGI 响应体,不处理 HTTP 层逻辑。它和 proxy_buffers 互不干扰,但若你在同一 location 中混用 proxy_pass 和 scgi_pass,务必分开配置——前者用 proxy_* 指令,后者用 scgi_* 指令,参数不可复用。
比如后端是 uWSGI 的 SCGI 服务,就绝不能写 proxy_buffer_size 16k 试图调大 header 缓冲,而必须用 scgi_buffer_size 16k,否则无效且可能报错。











