Nginx防恶意盗链与高频爬虫消耗带宽防御:几招搞定偷图盗链和流氓爬虫

Nginx防恶意盗链与高频爬虫消耗带宽防御:几招搞定偷图盗链和流氓爬虫

网络安全wl5net2026-11-11 23:51:28A+A-
约 3305 字 · 预计阅读 7 分钟

做外贸独立站或者海外内容站,很多新手站长最怕的不是没流量,而是月底看到服务器账单时当场脑溢血。前几年我刚入行那会儿交过不少学费——几台Linode的机器,莫名其妙带宽跑满、CPU卡死,排查半天发现不是业务暴涨,而是被中东和东欧的一群扒皮站把整站的产品高清图直接盗链过去,顺带几十个不知名的垃圾爬虫一天扫几十万次。对于天天盯着转化率和服务器成本的老站长来说,Nginx防恶意盗链与高频爬虫消耗带宽防御真不是什么高大上的玄学,而是关乎每个月真金白银运营成本的保命技能。

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的蜘蛛给防出去了,那就成了运维界的笑话。

  1. 白名单机制:如果你用了严苛的限流策略,尽量把搜索大厂的爬虫放进白名单。可以用 geo 模块配合 map 把已知的大厂IP段或者指定IP排除在 limit_req 之外。
  2. CDN兜底:如果用了Cloudflare,把防盗链和WAF的动作尽量前置到CF的Edge层做,服务器的Nginx只作为第二道防线。Cloudflare开个“Bot Fight Mode”,能帮你挡掉80%的弱智爬虫。
  3. 针对RSS和接口防刷:如果是WordPress一类的站,把 /wp-json/ 和 /feed/ 单独拿出来做限制,这些是爬虫最喜欢批量刷、也是最吃数据库的地方。

运维这件事,其实就是攻防的拉锯战。不要想着一套配置搞定后就一劳永逸。每隔两周连上服务器看一眼 access.log 和 error.log,根据最新的抓取特征动态修补你的Nginx规则。把盗链和垃圾爬虫防死了,你会发现原本要买8核16G的高配机器,其实2核4G就跑得飞起,一年省下来的服务器费用,够你买不少好用的SEO外链了。

点击这里复制本文地址 以上内容由未来技术网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

网站地图 robots.txt 网站死链 关于本站 工信部备案号浙ICP备2026012592号-2 浙公网安备33102402000669号