一、症状描述
最近网站被垃圾流量堆满了,经常造成ECS卡死,虽然使用了免费版的ESA还是难以幸免于难。某些遥遥领先的蜘蛛天天爬来爬去,一个流量也不给。
二、解决办法
(1)限速。
第一步,打开宝塔面板,选择“软件商店”,找到Nginx(版本根据您安装的不同而不同),点“设置”,找到配置文件。
在合适的位置输入以下内容。
# 限流区定义
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
# 全站通用限流:单 IP 每秒 5 次请求
limit_req_zone $binary_remote_addr zone=general_limit:10m rate=5r/s;
# 后台/登录严格限流:单 IP 每秒 1 次请求
limit_req_zone $binary_remote_addr zone=wp_login_limit:10m rate=1r/s;
# Ai:单 IP 每秒5次请求
limit_req_zone $http_user_agent zone=ai_bots:10m rate=5r/s;
# 把限流状态码改成 429(更语义化,也方便单独拦截)
limit_req_status 429;
limit_conn_status 429;
# 429 指向自定义页面
error_page 429 /429.html;
注意,这个429.html自己写一个,放到网站目录下(至少本站是),光配置上面还是不得生效。请进入第二步。

第二步,打开宝塔面板,选择“网站”,找到您的网站,点“设置”,找到配置文件。
输入以下代码
# 全站通用限流:单 IP 每秒 5 次,允许突发 10 个
limit_req zone=general_limit burst=10 nodelay;
# WordPress 登录页限流
location = /wp-login.php {
limit_req zone=wp_login_limit burst=3 nodelay;
}
# 后台目录限流
location /wp-admin/ {
limit_req zone=wp_login_limit burst=5 nodelay;
}
# sitemap不限流
location ~ ^/(sitemap\.xml|robots\.txt)$ {
try_files $uri =404;
}
第三步,打开宝塔面板,选择“网站”,找到您的网站,点“设置”,找到伪静态。
以Wordpress为例。改成以下情况
location /
{
try_files $uri $uri/ /index.php?$args;
limit_req zone=ai_bots burst=5 nodelay;
limit_req_status 429;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
(2)屏蔽垃圾蜘蛛
按照上面第二步的内容后面添加以下代码
# 不用 xmlrpc 就关掉
location = /xmlrpc.php {
deny all;
}
# 屏蔽常用垃圾蜘蛛
if ($http_user_agent ~* "SemrushBot|AhrefsBot|MJ12bot|DotBot|PetalBot|Bytespider|Scrapy|CCBot|python-requests|Wget") {
return 444;
}
三、最终效果
最终效果,CPU和负载基本恢复正常,服务器卡死目前未出现,网站的后台之类的也无异常,注意不要限制太死,否则网站的后台容易出问题,也容易误伤,至于参数多少,我这个我个人认为比较符合我的实际需求。