Nginx 缓冲区大小配置
Nginx 通过多级缓冲区管理请求/响应数据,合理配置可减少磁盘 I/O,提升高并发性能。
请求体缓冲
client_body_buffer_size
nginx
http {
# 请求体缓冲区大小
client_body_buffer_size 16k;
# 请求体最大大小
client_max_body_size 10m;
# 请求体临时文件目录
client_body_temp_path /tmp/nginx_client_body;
}
溢出机制
nginx
client_body_buffer_size = 16k
请求体 ≤ 16k: 内存处理(无磁盘 I/O)
请求体 > 16k: 溢出到临时文件(磁盘 I/O)
性能影响:
- 内存处理: ~0.1ms
- 磁盘处理: ~5-10ms(50-100x 性能差异)
默认值通常为 8k 或 16k,应根据业务请求体分布设置,避免频繁磁盘溢出。
代理响应缓冲
proxy_buffer 配置
nginx
location /api/ {
proxy_pass http://backend;
# 代理响应缓冲区
proxy_buffering on;
proxy_buffer_size 4k; # 响应头缓冲区
proxy_buffers 8 16k; # 响应体缓冲区(8 个 16k)
proxy_busy_buffers_size 32k; # 可发送给客户端的缓冲区上限
# 临时文件
proxy_temp_path /tmp/nginx_proxy;
proxy_max_temp_file_size 1024m;
}
缓冲区计算
| 参数 | 默认值 | 说明 |
|---|---|---|
| proxy_buffer_size | 4k/8k | 响应头 + 第一块响应体 |
| proxy_buffers | 8 × buffer_size | 总缓冲 = 数量 × 大小 |
| proxy_busy_buffers_size | 2 × buffer_size | 同时发送给客户端的缓冲区 |
proxy_buffers 总容量 = 数量 × 大小,决定可缓存的最大响应体。
其他缓冲区
fastcgi_buffer
nginx
location ~ \.php$ {
fastcgi_buffering on;
fastcgi_buffer_size 4k;
fastcgi_buffers 8 16k;
fastcgi_busy_buffers_size 32k;
}
uwsgi_buffer
nginx
location / {
uwsgi_buffering on;
uwsgi_buffer_size 4k;
uwsgi_buffers 8 16k;
}
调优策略
场景化配置
| 场景 | buffer_size | buffers | 说明 |
|---|---|---|---|
| API(小响应) | 4k | 8 × 4k | API 响应通常 < 32k |
| 静态文件 | 8k | 8 × 8k | 中等大小文件 |
| 大文件下载 | 16k | 16 × 16k | 减少磁盘 I/O |
| WebSocket | off | - | 禁用缓冲,实时转发 |
高并发调优
nginx
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 10240;
}
http {
# 减少每个连接的内存占用
client_body_buffer_size 8k;
proxy_buffer_size 4k;
proxy_buffers 4 8k;
# 限制总内存使用
# 单连接最大缓冲 = client_body_buffer_size + proxy_buffers 总和
# 10000 连接 ≈ 10000 × (8k + 32k) = 400MB
}
禁用缓冲
nginx
# 实时流媒体
location /stream/ {
proxy_buffering off;
proxy_request_buffering off;
}
# SSE/Server-Sent Events
location /events {
proxy_buffering off;
proxy_cache off;
}
监控与诊断
缓冲区溢出日志
text
error_log /var/log/nginx/error.log warn;
# 溢出时会记录
# [warn] 1234#0: *5 a]n upstream response is buffered to a temporary file /tmp/nginx_proxy/0000000001
内存使用计算
text
单连接内存占用:
= client_body_buffer_size
+ proxy_buffer_size
+ proxy_buffers (数量 × 大小)
+ 连接结构 (~2KB)
10000 并发连接:
= 10000 × (8k + 4k + 32k + 2k)
≈ 460MB
要点总结
- client_body_buffer_size 决定请求体内存/磁盘分界点,过小导致频繁磁盘 I/O
- proxy_buffers 控制响应体缓冲容量,总容量 = 数量 × 大小
- 高并发场景应减小缓冲区,避免内存耗尽
- WebSocket/SSE 场景需禁用缓冲,保证实时性
- 缓冲区配置应根据业务响应分布调整,而非盲目增大
📝 发现内容有误?点击此处直接编辑