实时发现异常流量的前提是明确关键判断维度,常见的异常指标包括:
/wp-login.php、/phpmyadmin)、敏感文件(如/etc/passwd)或非公开API;$request_time)显著上升(如超过500ms)、连接成功率下降(如conns_opened_percent低于90%)。通过grep、awk等命令快速提取日志中的关键信息,判断是否超过阈值。例如:
/wp-login.php)的请求,统计次数并判断是否异常。LOG_FILE="/var/log/nginx/access.log"
TIME_WINDOW=$(date --date='1 minute ago' "+%d/%b/%Y:%H:%M")
THRESHOLD=200
grep "$TIME_WINDOW" $LOG_FILE | awk '{print $1}' | sort | uniq -c | sort -nr | while read COUNT IP; do
if [ $COUNT -gt $THRESHOLD ]; then
echo "$(date) - 异常IP: $IP (请求数: $COUNT)" >> /var/log/nginx/ban.log
# 可扩展:调用iptables封禁IP或发送告警
fi
done
优化方向:添加白名单(避免误封CDN、办公IP)、自动解封机制(如封禁1小时后自动移除)。
通过Nginx的限流模块提前拦截异常请求,避免影响正常服务:
burst参数允许短暂超限);blocksip.conf文件,禁止高频异常IP访问(需配合ngx_http_access_module模块)。http {
# 定义限流共享内存区
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location / {
# 限流配置:峰值20r/s,允许突发5个请求
limit_req zone=req_limit burst=20 nodelay;
limit_req_log_level warn;
# 并发连接数限制
limit_conn conn_limit 5;
}
}
}
当检测到异常流量时,及时通知运维人员并采取措施:
mail命令或第三方邮件服务(如SendGrid)发送邮件告警,包含异常IP、请求数、时间等信息;log_format,包含$remote_addr(IP)、$status(状态码)、$request_time(响应时间)、$http_user_agent(UA)、$request_uri(请求路径)等字段,便于后续分析;