Nginx防恶意盗链与高频爬虫消耗带宽防御:几招搞定偷图盗链和流氓爬虫
做外贸独立站或者海外内容站,很多新手站长最怕的不是没流量,而是月底看到服务器账单时当场脑溢血。前几年我刚入行那会儿交过不少学费——几台Linode的机器,莫名其妙带宽跑满、CPU卡死,排查半天发现不是业务暴涨,而是被中东和东欧的一群扒皮站把整站的产品高清图直接盗链过去,顺带几十个不知名的垃圾爬虫一天扫几十万次。对于天天盯着转化率和服务器成本的老站长来说,Nginx防恶意盗链与高频爬虫消耗带宽防御真不是什么高大上的玄学,而是关乎每个月真金白银运营成本的保命技能。
今天不扯虚头巴脑的理论,直接把我在生产环境上跑了几年、扛住无数次小规模抓取的Nginx配置方案扒开给大伙看。
一、先抓现行:别瞎猜,看日志到底是谁在吸血
动配置之前,先别急着无脑复制网上的规则。登到你的VPS上,先看看到底是哪路神仙在狂刷你的资源。
跑这两行命令,几秒钟就能把吸血鬼揪出来:
# 抓取访问量前十的IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
# 抓取请求量前十的 User-Agent
awk -F\" '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
通常你会看到一堆带着 python-requests、Go-http-client、或者压根没写UA的请求,要么就是一些野鸡SEO工具的爬虫(比如某些国内镜像爬虫、或者毫无业务价值的抓取器)。如果某几个IP在几分钟内刷了几万次静态资源,不用怀疑,直接上手段。
二、切断图片被盗用:图片防盗链配置
别人拿你的图做站,图片直接引用你的S3或者服务器源站地址,用户访问他的站,消耗的却是你的流量。搞外贸站尤其是Shopify切自建站、WooCommerce或者Magento的,图库动辄几千上万张,被盗链一次带宽瞬间拉满。
在Nginx的 server 块里,针对静态资源的防盗链配置这么写:
location ~* \.(jpg|jpeg|png|gif|webp|svg)$ {
# 允许的域名列表,加上你自己的域名,允许空referer(有些移动端浏览器不带)
valid_referers none blocked server_names *.yourdomain.com yourdomain.com;
if ($invalid_referer) {
# 别回送一张“请勿盗链”的图片!那依然在耗你带宽!
# 直接返回 403,或者更狠一点返回 444(直接挂断TCP连接,不给对方回任何包)
return 444;
}
# 配合合理的缓存,减少磁盘IO
expires 30d;
add_header Cache-Control "public, no-transform";
try_files $uri =404;
}
老站长避坑提醒: 很多人喜欢在被盗链时
rewrite返回一张写着“禁止偷图”的搞笑表情包,听着挺解气,但你仔细想想:盗链站一天请求你那张表情包十万次,你的带宽依然在跑!最省带宽的做法就是return 444;。444是Nginx专有的非标准状态码,服务端直接断开连接,连个响应头都不给它,一个字节都不便宜它。
三、干掉流氓爬虫:UA过滤与频率限制
搜索引擎爬虫是分三六九等的。Googlebot、Bingbot那是衣食父母,必须好生招待;AhrefsBot、SemrushBot可以酌情放慢;至于那些连robots.txt都不遵守的流氓爬虫,直接在网关层给它拍死。
1. 粗暴但有效的 UA 过滤
在 http 块或 server 块里,把常见的垃圾脚本和恶意爬虫UA拉黑:
# 区分大小写匹配恶意UA
if ($http_user_agent ~* (Scrapy|HttpClient|Python|Java|Bytespider|FeedDemon|JikeSpider|Indy|Morfeus|YandexBot)) {
return 403;
}
# 拦截没有 User-Agent 的空请求(正常人上网绝不会不带UA)
if ($http_user_agent = "") {
return 403;
}
注:Bytespider是字节跳动的爬虫,抓取频率极高,如果不做国内业务、或者做纯海外内容站,很多站长会选择直接封掉它。
2. 限频与防并发击穿(Rate Limiting)
光封UA治标不治本,因为爬虫可以伪造各种Chrome浏览器的UA。这时候就必须用Nginx的连接数限制和请求频率限制。
在 nginx.conf 的 http 区域定义限速池:
# 每个IP每秒最多允许2个请求(针对API或动态页面)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=2r/s;
# 每个IP最大并发连接数为 10
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
在具体站点的 location / 区域应用规则:
location / {
# 限制单IP最大并发连接数
limit_conn conn_limit 10;
# 允许突发突发5个请求,nodelay表示超出的请求不排队直接拒绝
limit_req zone=req_limit burst=5 nodelay;
# 限制上传下载速率(比如限制单连接下载速度不超过 200k)
limit_rate 200k;
try_files $uri $uri/ /index.php?$args;
}
这样搞完之后,爬虫要是敢开多线程暴力扒你站,第3秒就会开始吃 503 Service Temporarily Unavailable,直接把它卡在门外,你的PHP-FPM和MySQL根本感知不到这波压力。
四、防误伤:别把真神给挡在门外
做外贸独立站全靠SEO吃饭,你要是把Google的蜘蛛给防出去了,那就成了运维界的笑话。
- 白名单机制:如果你用了严苛的限流策略,尽量把搜索大厂的爬虫放进白名单。可以用
geo模块配合map把已知的大厂IP段或者指定IP排除在limit_req之外。 - CDN兜底:如果用了Cloudflare,把防盗链和WAF的动作尽量前置到CF的Edge层做,服务器的Nginx只作为第二道防线。Cloudflare开个“Bot Fight Mode”,能帮你挡掉80%的弱智爬虫。
- 针对RSS和接口防刷:如果是WordPress一类的站,把
/wp-json/和/feed/单独拿出来做限制,这些是爬虫最喜欢批量刷、也是最吃数据库的地方。
运维这件事,其实就是攻防的拉锯战。不要想着一套配置搞定后就一劳永逸。每隔两周连上服务器看一眼 access.log 和 error.log,根据最新的抓取特征动态修补你的Nginx规则。把盗链和垃圾爬虫防死了,你会发现原本要买8核16G的高配机器,其实2核4G就跑得飞起,一年省下来的服务器费用,够你买不少好用的SEO外链了。
相关文章
- WordPress后门木马排查与彻底清除:WP后门木马排查与彻底清剿
- Cloudflare WAF防CC攻击规则实战配置:CF抗CC实战:站长保命指南
- Nginx安全响应头配置与加固:Nginx安全头加固与文案实战
- Linux服务器SSH防暴力破解与密钥登录:老站长聊SSH密钥与防爆破
- Fail2ban自动化封禁恶意扫描IP实操:老站长手把手教Fail2ban防扫描
- 外贸独立站数据库异地增量冷备份方案:外贸站异地冷备份救命指南
- SQL注入攻击特征分析与防御拦截:独立站SQL注入防御与防坑手记
- Linux网站根目录文件权限防提权加固:别乱给777:网站目录加固实战
- 外贸独立站DDoS大流量攻击应急清洗:外贸站抗DDoS防封救砖实录
- UFW防火墙严格出入站端口限制配置:独立站老兵聊UFW严格端口配置

