Nginx 中的 buffering、timeout、cache 与日志排障
理清 Nginx 在代理链路中的请求缓冲、响应缓冲、缓存、超时、日志和常见 4xx/5xx 状态码排查。
#type / synthesis
#status / growing
#tech / ops
#resource / nginx
[!info] related notes
- 所属 MOC: Nginx MOC
- 相关主题: SSE 连接问题(缓存与压缩)
- 相关对象: Nginx
Nginx 中的 buffering、timeout、cache 与日志排障
范围
- 这篇笔记关注 Nginx 在代理路径上的流量治理和运维排障能力。
buffering
proxy_request_buffering
控制请求体是否先被 Nginx 收完整,再发给后端:
proxy_request_buffering on;
好处:
- 保护后端免受慢客户端影响
- 后端看到的是更稳定的请求流
代价:
- 大上传会消耗 Nginx 的缓冲资源
- 后端不适合边收边处理
proxy_buffering
控制后端响应是否先被 Nginx 缓冲:
proxy_buffering on;
好处:
- 后端可以尽快把响应吐给 Nginx 并释放连接
- 慢客户端不会直接拖住后端
不适合:
- SSE
- 实时流式响应
- 边算边输出的场景
SSE 常见配置:
location /events {
proxy_pass http://backend;
proxy_buffering off;
proxy_cache off;
}
timeout
常见超时参数:
proxy_connect_timeout 5s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
send_timeout 60s;
含义:
proxy_connect_timeout:连接后端超时proxy_send_timeout:向后端发送请求超时proxy_read_timeout:等待后端响应超时send_timeout:向客户端发送响应超时
cache
Nginx 可缓存后端响应:
proxy_cache_path /var/cache/nginx
levels=1:2
keys_zone=mycache:100m
max_size=10g
inactive=60m
use_temp_path=off;
location / {
proxy_cache mycache;
proxy_cache_valid 200 10m;
proxy_cache_valid 404 1m;
proxy_pass http://backend;
}
常见调试头:
add_header X-Cache-Status $upstream_cache_status;
可能值包括:
HITMISSBYPASSEXPIREDSTALE
日志怎么看
常见路径:
/var/log/nginx/access.log
/var/log/nginx/error.log
查看方式:
tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/access.log
自定义日志格式示例:
log_format main '$remote_addr - [$time_local] '
'"$request" $status $body_bytes_sent '
'rt=$request_time '
'urt=$upstream_response_time '
'ua=$upstream_addr '
'us=$upstream_status';
重点变量:
$request_time:整条请求总耗时$upstream_response_time:后端响应耗时$upstream_addr:实际命中的后端$upstream_status:后端返回状态码
常见状态码怎么理解
403 Forbidden
常见原因:
- 目录权限不足
- 没有 index 文件且未开启目录索引
deny规则命中
404 Not Found
常见原因:
root/alias配错try_files没兜底location没按预期命中- 404 实际来自后端
413 Payload Too Large
请求体太大:
client_max_body_size 100m;
499 Client Closed Request
这是 Nginx 自定义状态码,表示客户端提前断开。
502 Bad Gateway
常见于:
- 后端没启动
- 端口写错
- Unix socket 权限问题
- Nginx 根本连不上 upstream
504 Gateway Timeout
常见于:
- 后端响应慢
- 数据库慢查询
- 线程池耗尽
proxy_read_timeout太短
调优方向
worker_processes auto;- 根据连接规模调整
worker_connections - 配合系统文件描述符限制,如
worker_rlimit_nofile - 静态文件场景考虑:
sendfile on;
tcp_nopush on;
tcp_nodelay on;
- 需要压缩时再开
gzip,不要对图片、视频、压缩包做重复压缩。 - 反向代理高并发时,优先看 keepalive、日志耗时和 upstream 健康,而不是盲目加大超时。