在 Nginx 里“过滤异常”通常指 分析 access.log / error.log,找出异常请求、攻击、异常状态或异常流量。下面按常见场景 + 实操命令给你一套实战方案。
常见异常类型:
awk '{print $9}' access.log | sort | uniq -c | sort -nr
只看异常状态码:
awk '$9 ~ /^(4|5)/' access.log
只看 404:
awk '$9 == 404' access.log
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
grep -E "(\.env|wp-admin|phpmyadmin|config|backup)" access.log
高危路径告警级别
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -nr
过滤空 UA 或扫描器:
grep -E '""|curl|python|scanner' access.log
awk '$NF > 3 {print}' access.log
假设最后一个字段是 request_time
awk '{if(length($7) > 200) print}' access.log
tail -n 100 error.log
grep -E "error|crit|alert|emerg" error.log
upstream timed outconnect() failedno live upstreamsclient intended to send too large bodytail -f access.log | awk '$9 ~ /^(404|500)/'
tail -f access.log | grep "1.2.3.4"
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
limit_req zone=one burst=20 nodelay;
}
}
if ($http_user_agent ~* (curl|python|scan|bot)) {
return 403;
}
location ~ /\.(env|git|svn) {
deny all;
}
goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED
可视化:
✅ 每天定时分析
awk '$9 ~ /^(4|5)/ {print $1}' access.log | sort | uniq -c | sort -nr > abnormal_ip.txt
✅ 结合 fail2ban
✅ 接入 ELK / Loki
我可以直接给你 精准命令 或 Nginx 配置,只需告诉我:
例如:
“我想过滤 1 分钟内访问超过 100 次的 IP”