Debian 上 Nginx 日志的查看与分析指南
一 定位日志位置与确认配置
- 默认路径:Nginx 日志通常在 /var/log/nginx/,常见文件为 access.log 与 error.log。若目录或文件名被自定义,可通过以下方式确认:
- 执行 nginx -t 检查配置语法并查看加载的配置文件路径;随后在配置中搜索 access_log 与 error_log 指令。
- 通过进程反查打开的日志文件:lsof -p $(pidof nginx | head -n 1) | grep log。
- 若使用 systemd 管理 Nginx,可用 journalctl -u nginx -f 实时查看服务日志(适合容器或无文件日志场景)。
二 快速查看与实时监控
- 实时查看错误日志(排错首选):tail -f /var/log/nginx/error.log
- 实时查看访问日志:tail -f /var/log/nginx/access.log
- 查看最近 N 行:tail -n 50 /var/log/nginx/error.log
- 按时间过滤 systemd 日志:journalctl -u nginx --since “2025-12-25 00:00:00” --until “2025-12-25 12:00:00”。
三 常用命令行分析示例
以下示例基于常见的 Combined 日志格式(字段顺序以实际为准):
- Top 10 来源 IP
- awk ‘{print $1}’ /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
- Top 10 请求路径
- awk ‘{print $7}’ /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
- 状态码分布
- awk ‘{print $9}’ /var/log/nginx/access.log | sort | uniq -c | sort -nr
- 指定时间段的 404 请求
- awk ‘$4 >= “[01/Dec/2025:00:00:00” && $4 <= “[01/Dec/2025:23:59:59” && $9 == 404 {print $0}’ /var/log/nginx/access.log
- 上一分钟请求总量
- date=$(date -d ‘-1 minute’ +‘%d/%b/%Y:%H:%M’); awk -v d=“$date” ‘$4 ~ d {c++} END {print c}’ /var/log/nginx/access.log
- 每个 URL 的访问次数与总发送字节数
- awk ‘{a[$7]++; size[$7]+=$10} END {for(v in a) print a[v], v, size[v]}’ /var/log/nginx/access.log
- 说明:若启用了耗时字段(如 $request_time、$upstream_response_time),可按耗时排序定位慢请求,例如:awk ‘{print $10, $7}’ access.log | sort -nr | head。
四 可视化与集中化分析
- GoAccess 快速报告
- 安装:sudo apt-get install goaccess
- 生成 HTML 报告:goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED
- 实时 HTML(需指定端口):goaccess /var/log/nginx/access.log --log-format=COMBINED --real-time-html --port=7890 -o /var/www/html/realtime.html
- 可结合 –ignore-crawlers、–geoip-database 等参数过滤与增强分析。
- 集中式方案
- ELK Stack(Elasticsearch + Logstash + Kibana) 适合海量日志的采集、检索与可视化。
- 系统级报告:logwatch 可生成日报/周报,例如:sudo logwatch --output html --range yesterday --detail high。
五 错误日志定位与常见问题处理
- 核心要点
- 错误日志是排错核心,优先查看 error.log;必要时在 http/server/location 中设置 error_log /var/log/nginx/error.log warn;,排查完成后再恢复合适级别(生产慎用 debug)。
- 典型错误与处置:
- 502 Bad Gateway / upstream timed out:检查上游(如 PHP-FPM/Node.js)是否运行、端口连通性、以及防火墙;必要时调整 proxy_connect_timeout / proxy_read_timeout。
- Permission denied:核对静态文件/目录权限与属主(如 www-data:www-data),并排查 SELinux/AppArmor 等安全模块限制。
- Segmentation fault:开启 worker_rlimit_core 生成 core dump,使用 gdb /usr/sbin/nginx core.pid 分析回溯;编译时加入 -g 便于调试。
- 辅助定位
- 配置语法校验:nginx -t
- 进程跟踪:对 Worker 执行 strace -p -s 1024 -e trace=file,network 观察文件访问与网络连接失败原因。