温馨提示×

Nginx日志如何过滤异常

小樊
36
2026-08-24 05:26:47
栏目: 编程语言

Nginx 里“过滤异常”通常指 分析 access.log / error.log,找出异常请求、攻击、异常状态或异常流量。下面按常见场景 + 实操命令给你一套实战方案。


一、先明确:你想过滤哪种“异常”

常见异常类型:

  1. HTTP 状态码异常
    • 400、403、404、499、500、502、503
  2. 请求量异常
    • 某个 IP 请求量过大
  3. 恶意请求 / 爬虫 / 扫描
    • 敏感路径(/wp-admin、/.env、/phpMyAdmin)
  4. URL 异常
    • 超长 URL、非法字符
  5. 响应时间异常
    • 慢请求
  6. 来源异常
    • 异常 Referer、User-Agent

二、access.log 过滤异常(最常用)

1️⃣ 过滤 HTTP 异常状态码

awk '{print $9}' access.log | sort | uniq -c | sort -nr

只看异常状态码:

awk '$9 ~ /^(4|5)/' access.log

只看 404:

awk '$9 == 404' access.log

2️⃣ 找到异常 IP(高频访问)

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20

只看异常状态码的 IP:

awk '$9 ~ /^(4|5)/ {print $1}' access.log | sort | uniq -c | sort -nr

3️⃣ 过滤访问敏感路径

grep -E "(\.env|wp-admin|phpmyadmin|config|backup)" access.log

高危路径告警级别


4️⃣ 过滤异常 User-Agent

awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -nr

过滤空 UA 或扫描器:

grep -E '""|curl|python|scanner' access.log

5️⃣ 过滤慢请求(需日志中有 $request_time)

awk '$NF > 3 {print}' access.log

假设最后一个字段是 request_time


6️⃣ 过滤 URL 异常(超长 / 异常字符)

awk '{if(length($7) > 200) print}' access.log

三、error.log 过滤异常

查看 error.log 最近异常

tail -n 100 error.log

只看错误(不看 info)

grep -E "error|crit|alert|emerg" error.log

常见异常

  • upstream timed out
  • connect() failed
  • no live upstreams
  • client intended to send too large body

四、实时过滤异常(监控用)

实时查看 404 / 500

tail -f access.log | awk '$9 ~ /^(404|500)/'

实时查看某个 IP

tail -f access.log | grep "1.2.3.4"

五、Nginx 配置层面过滤异常(推荐)

1️⃣ 限制异常 IP

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

server {
    location / {
        limit_req zone=one burst=20 nodelay;
    }
}

2️⃣ 封禁恶意 UA

if ($http_user_agent ~* (curl|python|scan|bot)) {
    return 403;
}

3️⃣ 防止敏感路径访问

location ~ /\.(env|git|svn) {
    deny all;
}

六、进阶:用工具自动化分析

goaccess(强烈推荐)

goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED

可视化:

  • 异常状态码
  • 访问来源
  • 热门恶意 URL

七、实战推荐组合(生产环境)

每天定时分析

awk '$9 ~ /^(4|5)/ {print $1}' access.log | sort | uniq -c | sort -nr > abnormal_ip.txt

结合 fail2ban

  • 自动封禁异常 IP

接入 ELK / Loki

  • 长期异常分析

八、你可以直接告诉我

我可以直接给你 精准命令Nginx 配置,只需告诉我:

  1. 日志格式(是否默认 combined)
  2. 想过滤哪类异常(攻击 / 爬虫 / 5xx / 慢请求)
  3. 操作系统(CentOS / Ubuntu / Docker)

例如:

“我想过滤 1 分钟内访问超过 100 次的 IP”

0