
排查 Nginx 访问异常,核心是读懂日志、定位时间点、识别异常模式。Linux 环境下,关键在于快速过滤、精准匹配、结合上下文判断。
确认日志路径和格式
Nginx 默认访问日志通常在 /var/log/nginx/access.log,错误日志在 /var/log/nginx/error.log。先确认配置中实际路径:
- 运行 nginx -T | grep access_log 查看生效的 access_log 指令
- 检查 log_format 定义(如是否包含
$status、$request_time、$upstream_status),这决定你能分析哪些维度 - 常见自定义格式会记录响应状态码、请求耗时、上游状态、用户代理、真实 IP(需配合
real_ip模块)
快速筛选异常响应状态码
4xx 和 5xx 是最直接的异常信号。用 awk 或 grep 快速统计或提取:
-
统计各状态码出现次数:
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr -
查最近 100 行 502 错误:
tail -100 /var/log/nginx/access.log | grep " 502 " -
查某 IP 的全部请求(含失败):
awk '$1 ~ /^192\.168\.1\.100$/ {print}' /var/log/nginx/access.log
关联时间与上游服务问题
很多异常(如 502、504)本质是后端不可达或超时。需比对 access.log 与 error.log 时间戳:
- 在 access.log 中找到一条 504 请求,记下时间(如
[12/Dec/2024:10:23:45) - 在 error.log 中搜索相近时间(±1秒):
sed -n '/Dec\/12\/2024:10:23:[44-46]/p' /var/log/nginx/error.log - 典型错误提示如
upstream timed out(网关超时)、Connection refused(后端未监听)、no live upstreams(负载均衡无健康节点)
识别高频恶意或异常行为
日志中反复出现的模式可能指向扫描、爬虫或攻击:
- 高频 404:大量不同路径的 404(尤其含 wp-admin、phpmyadmin、.git 等),可能是目录爆破
-
单 IP 短时高并发:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20 -
异常 User-Agent:空 UA、含 sqlmap/nikto/Go-http-client 等字段,可用
grep -i "sqlmap\|nikto" /var/log/nginx/access.log -
大请求体或慢请求:关注
$body_bytes_sent和$request_time字段(需日志格式支持),例如耗时 >5s 且返回 200,可能被用于探测或资源消耗
不复杂但容易忽略:日志轮转后要查对应日期文件(如 access.log.1.gz),别只盯当前文件;时间要换算成服务器本地时区;Nginx 缓存或 CDN 可能导致真实客户端 IP 被隐藏,需确认 X-Forwarded-For 是否可信并已写入日志。










