Nginx的error_log不直接控制worker进程工作流,但能精准暴露其生命周期、配置加载、系统调用及异常退出等问题,结合日志级别选择、系统工具联动和权限管理,可有效优化子进程行为。

明确全局 error_log 的作用边界
全局块(nginx.conf 最外层,不在 http 或 server 块内)的 `error_log` 记录的是 master 进程启动、worker 进程 fork/exit、信号处理、配置重载、端口绑定失败等 core 级事件。这些日志是诊断子进程“为何起不来”“为何频繁退出”“为何 reload 失败”的第一线索。
- 若 `nginx -s reload` 后 worker 进程没更新,查全局 error_log 是否有
failed to bind或permission denied - 若 worker 进程偶发崩溃,日志中出现
worker process [PID] exited on signal 11,说明存在段错误,需配合 core dump 分析 - 日志中反复出现
could not build the server_names_hash,表明 server_name 过多或 hash 冲突,需调大server_names_hash_max_size和server_names_hash_bucket_size
按场景选对日志级别,避免信息淹没或缺失
子进程问题往往藏在 notice 或 info 级别里,而生产环境默认 error 级别会跳过关键提示:
-
warn:捕获配置隐患(如
ssl_protocols已弃用)、资源警告(too many open files),适合日常巡检 - notice:记录 worker 启动/退出、reload 完成、cycle 重建等生命周期事件,验证 reload 是否真正生效
- info:显示模块初始化顺序、配置解析路径、信号接收详情,适合排查模块加载失败或指令未生效
-
debug:仅限临时调试(需编译含
--with-debug),可看到每个请求进入 worker 后的事件循环细节,但日志量极大,不建议常开
把 error_log 和系统工具联动验证
error_log 告诉你“发生了什么”,系统工具帮你确认“为什么发生”:
- 看到
bind() to 0.0.0.0:443 failed (98: Address already in use)→ 执行lsof -i :443或netstat -tuln | grep :443查端口占用 - 日志提示
open() "/etc/nginx/conf.d/*.conf" failed (24: Too many open files)→ 检查ulimit -n,并在/etc/security/limits.conf中提升 nginx 用户的 nofile 限制 - worker 频繁重启且无明显错误 → 用
strace -p $(cat /var/run/nginx.pid) -e trace=clone,exit_group,kill观察是否被外部信号终止
配合日志轮转与权限管理保障持续可观测
子进程写日志失败本身就会引发连锁问题(如无法记录崩溃原因):
- 确保 error_log 路径所在目录对 nginx worker 用户(如 www-data 或 nginx)有写权限,且磁盘空间充足
- 用 logrotate 配置自动轮转(如每日切割、保留14天、压缩归档),避免日志填满磁盘导致 worker 因 write 失败而异常退出
- 轮转后务必发送
kill -USR1 $(cat /var/run/nginx.pid),通知 master 重新打开新日志文件——否则 worker 仍往旧文件句柄写,造成日志丢失


















