error_log是Nginx底层运行状态的诊断报告,只记录配置、权限、连接、资源等错误,不按HTTP状态码分类;其核心价值在于错误级别、关键词、路径及行号,需结合nginx -t检查、权限修复、上游连通性验证和系统资源排查进行精准定位。

error_log 是 Nginx 自身运行状态的“诊断报告”,不记录业务逻辑,只反映配置、权限、连接、资源等底层问题。它不按 HTTP 状态码分类(如 404、502),而是以 错误级别 + 错误描述 + 上下文位置 的形式呈现。真正需要关注的是日志中的关键词、错误等级和具体路径/行号。
配置语法类错误(高频、易修复)
这类错误在 nginx -t 检查时就会暴露,启动失败前就能拦截。
-
missing semicolon 或 unexpected “}”:典型符号缺失,比如
listen 80少了分号,或括号多写/漏写。查看报错行号(如nginx.conf:87),逐行核对{ }、;和缩进是否匹配。 -
duplicate directive:如
root、server_name在同一作用域重复定义。Nginx 不允许同名指令多次出现,删掉冗余行即可。 -
invalid number or parameter:比如
client_max_body_size abc写了非数字值,或worker_processes auto在不支持的旧版本中使用。确认参数类型与文档一致。
权限与路径类错误(常见于部署后)
即使配置无误,Nginx 进程也可能因系统限制无法正常工作。
-
Permission denied:例如
could not open error logfile或open() "/var/log/nginx/error.log" failed (13: Permission denied)。说明运行 Nginx 的用户(通常是www-data或nginx)对日志目录没有写权限。执行sudo chown -R www-data:www-data /var/log/nginx并确保目录有drwxr-xr-x权限。 -
No such file or directory:如
open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)。通常因上次异常退出未清理 pid 文件,或目录不存在。手动创建目录并赋权,或用nginx -c /path/to/nginx.conf重新加载生成。 -
directory not found:
root或alias指向的路径实际不存在。检查ls -l确认路径真实存在且拼写准确,注意软链接是否失效。
上游服务连接类错误(502/504 根源)
这类错误出现在反向代理场景,error_log 中会明确指向 upstream 通信失败。
-
no live upstreams while connecting to upstream:Nginx 认为所有后端节点都不可用。检查
upstream块中 server 地址、端口是否正确;确认后端服务已启动并监听对应端口(netstat -tlnp | grep :8080);排查max_fails和fail_timeout是否过于敏感导致误判下线。 -
Connection reset by peer while reading response header from upstream:后端提前关闭连接。常见于后端超时时间短于 Nginx 的
proxy_read_timeout,或后端进程崩溃。统一调大后端超时设置,并检查后端日志是否有 OOM、panic 或主动 close。 -
recv() failed (111: Connection refused):Nginx 尝试连接后端时被拒绝。基本可判定后端未监听、防火墙拦截、或地址写错(如写成
127.0.0.1:8080但后端监听0.0.0.0:8080)。
资源与运行时异常(需深入排查)
这类错误往往伴随服务不稳定或偶发崩溃,日志中会出现信号或内存相关提示。
- worker process XXX exited on signal 11 (core dumped):严重异常,通常是模块冲突、内存越界或第三方模块 bug。先禁用所有非必要模块(尤其是动态加载模块),升级 Nginx 到稳定版,必要时启用 core dump 分析。
-
too many open files:系统文件描述符耗尽。检查
ulimit -n,在/etc/security/limits.conf中为 nginx 用户设置更高限制,并在 nginx.conf 的 main 块中添加worker_rlimit_nofile 65535;。 -
emerg level errors:如
[emerg] ... bind() to 0.0.0.0:80 failed (98: Address already in use),说明端口被占用。用sudo lsof -i :80查看并释放进程。


















