Nginx 中的 buffering、timeout、cache 与日志排障

理清 Nginx 在代理链路中的请求缓冲、响应缓冲、缓存、超时、日志和常见 4xx/5xx 状态码排查。

#type / synthesis #status / growing #tech / ops #resource / nginx

[!info] related notes

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;

可能值包括:

  • HIT
  • MISS
  • BYPASS
  • EXPIRED
  • STALE

日志怎么看

常见路径:

/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 健康,而不是盲目加大超时。
创建于 2026/5/7 更新于 2026/5/27