生产环境Nginx的error_log应分层配置:全局设error专守停服级问题,关键server设warn捕获高频可恢复故障,非核心location降级或关闭日志,debug仅临时启用且须满足--with-debug编译及路径隔离,并联动iostat、df等监控验证IO影响。

生产环境 Nginx 的 error_log 不是越详细越好,而是要让每条日志都承担明确诊断职责:全局守住底线,业务按需发声,调试精准隔离,IO 可测可控。
全局只设 error,专守进程级崩溃
在 nginx.conf 最外层(main 块)配置:
-
固定为
error_log /var/log/nginx/global_error.log error;—— 仅捕获 master/worker 启动失败、端口被占、模块加载异常、fork 崩溃等停服级问题 - 绝不设
info或debug—— reload 时会刷出数百行生命周期日志,干扰判断且无实际定位价值 - 路径建议独立(如
/var/log/nginx/global_error.log),避免与业务日志混写,便于监控告警单独接入
关键 server 块设 warn,覆盖高频可恢复故障
对核心业务域名(如支付、登录、API 主入口),在对应 server 块内显式声明:
-
error_log /var/log/nginx/pay_error.log warn;—— 能捕获upstream timed out、client sent too large body、rewrite or internal redirection cycle、证书过期、连接拒绝等高价值预警 - warn 级别天然包含
error/crit/alert/emerg,无需重复设置,日增日志通常 ≤50MB,IO 压力可控 - 若某
server块未设error_log,它会继承上层(如 http 块)配置;但生产环境应禁用 http 块顶层统一设置,防止误覆盖
非核心路径降级或关闭,过滤冗余噪音
静态资源、健康检查、favicon、埋点接口等低风险路径,应主动抑制无效日志:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 在
location块中设error_log /dev/null crit;或error_log off;(Nginx 1.19+ 支持) - 配合
log_not_found off;关闭 404 类错误记录,尤其针对.ico、.png等常见缺失资源 - 不推荐在 location 内设
debug以外的低级别日志——作用域太小,收益低,维护成本高
debug 仅临时启用,且必须满足硬条件
debug 不是常规选项,而是手术刀式排查工具:
- 先验证编译参数:
nginx -V 2>&1 | grep -o with-debug,无输出则 debug 配置静默失效 - 必须显式写成
error_log /mnt/ssd/debug_api.log debug;(路径须可写、独立 SSD 分区,防系统盘写满) - 建议加
if条件限制范围,例如:if ($http_x_debug = "1") { error_log /mnt/ssd/debug_trace.log debug; } - 启用后立即配合过滤分析:
grep -E "(conf|cycle|upstream|ssl)" /mnt/ssd/debug_api.log,避免全量日志淹没关键线索
必须联动系统指标验证效果
日志策略是否合理,不能只看配置,要看实时 IO 表现:
- 开启
warn后运行iostat -x 1,若%util持续 >85%,说明日志已成磁盘瓶颈,需收缩范围或降级 - 用
df -h /var/log和ls -lh /var/log/nginx/监控增长,warn 级下日增超 50MB 应检查是否误启了 http 块顶层配置 -
nginx -t耗时明显变长?可能是 debug 日志干扰 fork 性能,需排查残留配置 - 容器环境优先走
syslog:server=unix:/dev/log,由 journald 统一收敛,解耦日志写入与应用进程










