crit级别错误日志仅记录影响服务可用性的严重故障,如worker崩溃、端口占用、SSL初始化失败等,不包含500错误或超时;需分层配置并配合资源调优与巡检。

用 crit 级别配置 error_log,本质是做“错误日志的精准过滤”——它不记录 warn、error 这类常见问题,只捕获真正影响服务可用性的严重故障,比如 worker 进程崩溃、内存分配失败、监听端口被占用、SSL 初始化致命错误等。在高并发场景下,这能大幅降低日志 IO 压力,同时让运维人员一眼锁定关键风险点。
明确 crit 级别的实际覆盖范围
crit 是“critical”的缩写,属于 Nginx 错误日志级别中偏上的一档(比 error 严重,比 alert/emerg 略宽松)。它会记录:
- worker 进程意外退出(如段错误、OOM killer 杀掉进程)
- 无法绑定监听地址或端口(
Address already in use或Permission denied) - 配置加载阶段的关键失败(如 SSL 证书解析失败、upstream server 地址无效且无 fallback)
- 共享内存区(如 limit_req_zone、ssl_session_cache)初始化失败
注意:PHP 或后端应用抛出的 500 错误、上游超时(upstream timed out)、客户端主动断连等,通常只记为 error 或 warn,不会出现在 crit 日志里——这是设计使然,不是配置失效。
在合适的作用域中设置 crit 级别
不要只在全局 http 块设一个 error_log ... crit 就完事。应分层控制,兼顾排查效率和日志精简:
- 主配置
nginx.conf的main或http块中,设为error_log /var/log/nginx/error.log crit;,作为兜底策略 - 对核心业务 server 块(如支付、登录),可额外加一行
error_log /var/log/nginx/pay-error.log crit;,实现错误日志物理隔离 - 避免在
location级别重复定义error_log,除非该路径有特殊调试需求(此时建议用debug并临时启用)
配合其他手段提升定位效率
单靠 crit 日志还不够快,需搭配以下做法:
- 确保
worker_processes auto;和worker_rlimit_nofile设置合理,防止因资源耗尽触发 crit 级错误却查不到根源 - 开启
daemon off;+stderr输出(仅限容器或调试环境):error_log stderr crit;,便于与日志采集工具(如 fluentd)直连 - 用
log_format自定义 error_log 的输出字段(Nginx 1.19+ 支持),例如加入$pid和$connection,方便关联崩溃时的具体进程与连接上下文 - 定期检查
nginx -t输出,很多 crit 错误其实在 reload 阶段就能提前暴露(如证书过期、路径权限不对)
验证与日常巡检建议
配置生效后,可通过人为触发一次 crit 级事件来验证,例如:
- 手动 kill -SEGV 一个 worker 进程(测试环境)
- 修改配置让 listen 指令绑定已占端口,再执行
nginx -s reload
观察日志是否准确记录,并确认非 crit 级错误(如 404、502)未混入。生产环境建议每天用 grep "crit\|emerg\|alert" /var/log/nginx/error.log | tail -20 快速扫描——真正需要人工介入的问题,往往就藏在这二十行里。


















