精准控制日志范围、频率和粒度才能缓解i/o饥饿,而非单纯调高级别;应分域设置error/warn日志、将limit_conn_log_level设为error、debug仅限临时专路径使用,并通过iostat等工具验证效果。

按作用域分级:全局 error + 关键 server warn
全局 `error_log`(nginx.conf 顶层)只记录 master 进程级致命问题:配置加载失败、端口冲突、worker 启动异常。这类错误极少发生,但必须可查。设为 error 级,单独文件存储(如 /var/log/nginx/error-global.log),避免混入请求链路日志。
HTTP 层才是排障主战场。对核心业务域名或 API server 块,显式设置:error_log /var/log/nginx/core-api-error.log warn;
非核心接口(如静态资源、健康检查)保持 error 级即可。这样既捕获证书过期、重定向循环、upstream 拒绝连接等高价值预警,又避免每个 rewrite 匹配都打日志。
关掉“日志放大器”:limit_conn_log_level 设为 error
默认 `limit_conn_log_level warn` 是 I/O 饥饿常见源头——当爬虫或突发流量触发限流时,每秒数百条重复 warn 日志瞬间刷爆磁盘。只需一行:limit_conn_log_level error;
它让 Nginx 仅在 zone 初始化失败等极少数异常时记日志,正常连接拒绝完全不落盘。效果立竿见影:error.log 日增从 GB 级降到 MB 级以内。
若需审计超限行为,应从 access_log 中提取状态码 503,而非依赖 error.log。
临时诊断用 debug,必须“开即关、专路径、独磁盘”
debug 级别不是配置项,是手术刀:
• 仅在怀疑 SSL 握手失败时,在对应 location 块内加:error_log /mnt/ssd/debug-upstream.log debug;
• 输出路径必须挂载在独立 SSD 分区(避免和系统日志争 IO);
• 使用 grep -E "(ssl|upstream|connect)" 快速过滤,不读全量;
• 问题定位后立即删掉该行配置并 reload。
全局启用 debug 或未指定路径,等于主动触发 I/O 饥饿。
联动监控验证策略是否真生效
调完级别不算完,得看系统反馈:
• iostat -x 1 观察 `%util`:若持续 >85%,说明日志写入仍是瓶颈,需进一步收缩范围(如仅保留 2 个关键 server 块);
• df -h /var/log 和 ls -lh /var/log/nginx/:warn 级下日增应 ≤50MB,超标则启用 logrotate 的 copytruncate 模式;
• nginx -t 耗时明显变长?可能是 debug 日志干扰了 fork 性能,检查是否误启全局 debug。











