没用的脚本又增加了 - 高频请求处理
这个脚本是与nginx和Cloudflare配套使用的。在一分钟内累计请求数达到1000时,进入under attack模式10分钟,然后解除。 当然,数值是可以根据情况修改的。
原理很简单,每30秒统计一下nginx的访问日志即可。脚本差不多90%是gpt完成的。
功能很简单,不过nginx和cloudflare居然都没有简单的方法实现这一点。cf的rate limit基本就是个废物。因为现在主流的cc都是多ip低访问量的方式。
因为每30秒钟要扫描一次日志文件,如果访问量很大,这脚本当然就不能用了,不然太消耗资源,一般小网站没问题的。
#!/bin/bash
# 日志文件路径
LOG_FILE="/var/log/nginx/access.log"
CHECK_LOG="/var/log/nginx/check.log" # 输出日志文件路径
# Cloudflare API 相关信息
ZONE_ID="xxxxxxxxxxxxxxxx" # Cloudflare Zone ID
EMAIL="xxxxxxxxxxx" # Cloudflare 登录邮箱
API_KEY="xxxxxxxxxxxx" # Cloudflare Global API Key
# 请求阈值和计时
THRESHOLD=1000
COOLDOWN_TIME=10 # Under Attack 模式保持的分钟数
while true; do
# 统计过去 1 分钟的请求次数
REQ_COUNT=$(grep "$(date +'%d/%b/%Y:%H:%M')" $LOG_FILE | wc -l)
# 检查请求数是否超过阈值
if [ "$REQ_COUNT" -gt "$THRESHOLD" ]; then
echo "$(date) - Requests in last minute: $REQ_COUNT. Exceeded!" >> $CHECK_LOG
echo "$(date) - Enabling 'Under Attack' mode." >> $CHECK_LOG
# 启用 Cloudflare "Under Attack" 模式
curl -s -o /dev/null -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/settings/security_level" \
-H "X-Auth-Email: $EMAIL" \
-H "X-Auth-Key: $API_KEY" \
-H "Content-Type: application/json" \
--data '{"value":"under_attack"}'
# 等待 10 分钟后关闭 "Under Attack" 模式
sleep "${COOLDOWN_TIME}m"
# 取消 Cloudflare "Under Attack" 模式
curl -s -o /dev/null -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/settings/security_level" \
-H "X-Auth-Email: $EMAIL" \
-H "X-Auth-Key: $API_KEY" \
-H "Content-Type: application/json" \
--data '{"value":"medium"}'
echo "$(date) - 'Under Attack' mode disabled." >> $CHECK_LOG
else
echo "$(date) - Requests in last minute: $REQ_COUNT. No action needed." >> $CHECK_LOG
fi
# 等待 30s再检查
sleep 30
done