Linux Nginx 日志排查访问异常

6次阅读

Linux Nginx 日志排查访问异常

排查 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 是最直接的异常信号。用 awkgrep 快速统计或提取:

  • 统计各状态码出现次数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 是否可信并已写入日志。

text=ZqhQzanResources