@Lenciel

Nginx 挡爬虫

目录

Why

这个小破站每年服务器+CDN+SSL证书还是花了点儿钱。

其实也有些流量,但我从来没有想过要做大做强。

首先,它主要服务于我。

我活着的时候,有写点儿东西的需要。如果其他人看了有两三句产生些共鸣,那也挺好。

我死了之后,孩子们有个地方,知道我想过什么,怎么想的,比去扫墓更实在也更方便。

其次,它多少起到点儿保持和开发者世界同步的作用。

麻雀虽小,从前到后该有的都有,比如也 host 了一个 umami 实例做点儿轻量的统计。

因此我非常清楚,除开来自于网友们的浏览器和 RSS 阅读器,还有很多 RSS 聚合器在访问这里,抓取数据去做自己的合集(就像这里,或者这里,或者这里)。

我不介意,反而挺希望这些聚合器做大做强的:毕竟,在这个短视频推送霸占注意力的年代,这些有点「古朴」的服务如果运行良好,总归好像说明点儿什么。

一年多前,爬虫的主力开始逐渐变成了各种公司的 bot。

没办法,AI 时代,最缺的其实是数据。

自己写的东西被采集拿去炼丹,绝不会有被网友看了之后共鸣的可能,所以多少让人有些不舒服。

但我一个草民,肯定没有到宫崎骏被 OpenAI 搞得那么不舒服,也就一直懒得管。

直到最近看 Rob Pike 收到一封由 AI 编写的感谢信之后大爆粗口

Fuck you people. Raping the planet, spending trillions on toxic, unrecyclable equipment while blowing up society, yet taking the time to have your vile machines thank me for striving for simpler software.

Just fuck you. Fuck you all.

I can’t remember the last time I was this angry.

可不是吗。Fuck You!

How

Nginx

用 Nginx 只是因为我就用了 Nginx 来 host 博客。

看了一下, ai.robots.txt 这个项目基本上可以满足所有的需要。

robots.txt

robots.txt 是 Robots Exclusion Protocol (RFC 9309) 的一个实现。

基本上就是告诉爬虫们在访问网站的时候应该采取什么样的规矩。

对绝大部分 AI 爬虫,显然只有一个规矩,那就是完全拒绝:

Disallow: /

具体的写法可以参考 repo 里的robots.txt 文件。

UA 拦截

由于大部分的AI 爬虫都不会按 robots.txt 里的规矩办事, repo 里还有一个 nginx-block-ai-bots.conf 文件。它的任务就是根据访问的 UA 来识别是不是爬虫,然后干掉它们:

set $block 0;

if ($http_user_agent ~* "(AddSearchBot|AI2Bot|AI2Bot...)") {
    set $block 1;
}

if ($request_uri = "/robots.txt") {
    set $block 0;
}

if ($block) {
    return 403;
}

我写了一个脚本定期去更新这个配置文件,然后在我的 blog 的 virtualhost 配置里引用它:

# nginx.conf
server {
    include /home/blog/source/ai-robots-txt/nginx.conf;
    # ... 
    # the rest of my nginx config
}

然后通过 curl 就可以验证对于守规矩的比如 Google搜索引擎收录网页的 bot,仍然放行:

$ curl -I -A "Googlebot" https://lenciel.com

HTTP/2 200
server: nginx/1.18.0 (Ubuntu)
date: Wed, 07 Jan 2026 00:42:35 GMT
content-type: text/html
content-length: 35753
...

但是对于不守规矩的就挡掉:

$ curl -I -A "Sogou web spider" https://lenciel.com

HTTP/2 403
server: nginx/1.18.0 (Ubuntu)
date: Wed, 07 Jan 2026 00:41:53 GMT
content-type: text/html
content-length: 162
限制频率

写过爬虫都知道伪装一下 UA,所以光是从 UA 识别肯定是挡不完的,可以再结合一下对访问频次的限制,毕竟人类看和机器看的主要区别就是这个。

先声明一下:

#nginx conf http block
...
    limit_req_zone $binary_remote_addr zone=anti_spider:10m rate=5r/s;
    limit_conn_zone $binary_remote_addr zone=perip:10m;
...

然后在virtualhost配置中引用:

#nginx virtual host server block
...
    limit_conn perip 5;
    limit_req zone=anti_spider burst=10 nodelay;
...

fail2ban

虽然回复了一个 403, 但我每月花钱的服务器仍然被爬虫在访问,怎么办?

所以我把这些挡掉的访问拆到一个单独的日志去记录:

#nginx conf http block
...
	log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
	log_format spider '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" [SPIDER_BLOCKED]';
        limit_req_zone $binary_remote_addr zone=anti_spider:10m rate=5r/s;
...
...
#nginx virtual host server block
	    access_log /var/log/nginx/spider_block.log spider if=$block;
	    access_log /var/log/nginx/lenciel.access.log main if=!$block;
	    error_log /var/log/nginx/lenciel.error.log;
...

很快这个 spider_block.log 就开始有数据了:

$ awk '{print $1 $12$13$14}' /var/log/nginx/spider_block.log | sort | uniq -c | sort -nr | head -n 10

      4 18.206.242.175"TerraCottahttps://github.com/CeramicTeam/CeramicTerracotta""-"
      2 82.156.203.36"Mozilla/5.0(compatible;Boyouquanspider/1.0;
      1 98.83.177.42"Mozilla/5.0AppleWebKit/537.36(KHTML,
      1 66.249.66.66"Mozilla/5.0(Linux;Android
      1 66.249.66.65"Mozilla/5.0(Linux;Android
      1 66.249.66.4"Mozilla/5.0(Linux;Android
      1 66.249.66.43"Mozilla/5.0(Linux;Android
      1 66.249.66.43"Mozilla/5.0AppleWebKit/537.36(KHTML,
      1 66.249.66.204"Mozilla/5.0AppleWebKit/537.36(KHTML,
      1 65.21.113.201"Mozilla/5.0(compatible;AwarioBot/1.0;

把这个文件作为输入给到 fail2ban:


#/etc/fail2ban/jail.local
...

[nginx-spider]
enabled = true
filter = nginx-spider
logpath = /var/log/nginx/spider_block.log
maxretry = 1
action = iptables-allports[name=nginx-spider, chain=INPUT]

声明的 filter 需要配置一下:


#/etc/fail2ban/filter.d/nginx-spider.conf

[Definition]
failregex = ^<HOST> -.*\[SPIDER_BLOCKED\]$
ignoreregex = 192.168.1.1 10.0.0.1

重启服务之后就可以看到 nginx-spider 在工作了:


$ systemctl restart fail2ban

$ fail2ban-client status nginx-spider
Status for the jail: nginx-spider
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	24
|  `- File list:	/var/log/nginx/spider_block.log
`- Actions
   |- Currently banned:	24
   |- Total banned:	24
   `- Banned IP list:	18.206.242.175 107.22.208.39 222.189.173.253 54.204.12.115 34.203.111.15 82.156.203.36 66.249.66.43 114.119.136.109 223.109.211.219 123.182.49.58 106.8.138.96 220.181.108.110 114.119.138.235 106.8.139.2 114.119.135.232 44.193.102.198 23.23.103.31 66.249.66.66 114.119.134.146 114.119.148.160 106.8.139.14 110.249.201.178 223.109.211.198 114.119.150.190 66.249.66.65 114.119.155.205 106.8.130.121 123.182.48.123 223.109.211.172 49.86.41.90 223.109.207.80

Again, Fuck AI crawlers…

2025年终总结

今年本座高龄创业,蒙爷幼齿出海,各刷各的新副本。

我们的互动骤减,日常答疑变成了每周一次的邮件。

当然不是《傅雷家书》。

英文强诌,短小狭促。词不达意,曲折艰辛因为现在要陪他提高英文读写能力。可能再过两年得反过来,用中文邮件来往,保持中文读写能力。

还有个隐含目的,就是让邮件,这种有点不那么「及时」的通信方式,被蒙爷所熟悉。

他说感觉还挺好的。

两周前和他的监护人 Andy & Fay 约在香港,边吃边聊。一直生活在牛津附近,经历了资本主义八九十年代美好时光的 Andy 说,无论给他什么,他都不要当今天的 teenager:

我小时候从不担心今后。我读书,我玩耍,我知道我会有个工作,我知道我会成家。现在的小朋友方方面面都很迷茫:读什么书?谈不谈恋爱?做什么工作?现在还要加上一个,干不干得过 AI?

我看着身边没心没肺喜笑颜开的久久,心想倒也未必:今天的大人和小孩一样,在算法统治的世界里并不算逃过一劫,反而面临的挑战烈度更高。

Karl Ove Knausgaard 的《My Struggle》里有段描写,千禧年 DVD 问世后,主角和老婆整天躺在沙发上沉迷此道:

我们想要娱乐。而且必须尽可能轻松便捷。所有事情都是如此。我几乎不再读书了;如果有报纸,我宁愿读报纸。而且情况还在不断变糟。这很愚蠢,因为这样的生活什么也给不了你,它只是让时间白白流逝

二十多年过去了,生活还是「什么也给不了你」,时间还是「白白流逝」,DVD 却早已败下阵来。人类的注意力被手机为主的各种屏幕劫持,过得更加孤独,更加茫然。

当现实世界和数字世界的界限越来越模糊时,我们可以为小孩儿和自己做的事情应该是类似的。

今天打总结,我提三点。

找到自己的北极星

人类作为一个物种如此充满活力,是因为我们可以超越基本需求,追求一些代表着目标、使命和梦想的「北极星」单凭这一点我就不觉得会有一些人所谓的 AGI,因为人的创造如此不同。

每个人的北极星都可以不同:有人看重家庭,有人看重财富,有人看重影响力。

我们为在各种领域取得成就的人击掌喝彩。

每个人的生命也很长,不同阶段往往还会有不同的北极星。

可惜主角一旦是我们自己,或者特别是我们的孩子时,大家就会变得很实际,把路搞得又挤又窄:好好学习,好好考试,干个律师、医生、程序员、金融分析师之类的「好工作」,建立个「好家庭」…

这不是任何人的错。做父母的都会努力推动孩子们「欣欣向荣」,我们所处的社会又是这样的追求绩优。

但我们也明白这「欣欣向荣」不是智慧或者成长上的,而是财务或者说是稳定性上的。

于是有很多人,可能已经到了中年甚至老年,还没有为自己真正看重的事情努过力光说工作这件事情,盖洛普关于职业投入度的调查数据显示,59% 的人在工作中并不投入。考虑到大多数人一生中会工作 8 万小时,差不多占生命的三分之一,这数据有点太可怕了。

今年随着 AI 霸屏,很多人的体感很差。

我反而觉得,我们处在人可以掌控生活,在自己充满热情的事情上不断精进并取得成功,最好的时代。

因为我们有了很多又强大又便宜的工具,它们不仅可以陪你深入地探索你的北极星究竟是什么,还能帮你掌握学习和构建的能力,让你更好地去追求北极星AI 让我们追求自己的北极星变得更容易,还有个越来越明显的体现:过去,在很多领域因为天赋和资源非常重要,想进入也没法参与。比如就算赛车是我的北极星,我肯定没法成为一个 F1 车手。但随着工具特别是 AI 工具在各行各业里的重要性提升,我可以到车队里去做一些同样有成就感的核心工作,隔行将不再隔山。

一个事情是不是真的是北极星,最好的判据就是你是不是真的愿意在这个领域花很多时间去学习和构建。毕竟学习和构建,可比玩玩手机刷刷视频摩擦力大多了回顾在某个领域获得非凡成就的人,都可以找到近乎偏执的热情。到纽约之前的鲍勃·迪伦在明尼苏达州闲逛,非常深入地研究了当地音乐。毕加索现实主义的画在少年时代就已经驾轻就熟。时装界最好的发型师 Jen Atkins 成名前自费去巴黎时装周,从后门偷偷溜进去给舞台上的模特做头发。我自己其实也不擅长意志力或自律,但我擅长痴迷。要么全开,要么全关。

掌握学习和构建的能力

AI 在很多地方被高估了,但是在教育领域的作用肯定被低估了。

学习的工具或者途径很集中时,我们大部分人只好如 Andy 说的一样按部就班:K12,大学,各种实习和培训…

AI 会大大提高有明确北极星的那部分人的学习效率。

教育的下游,创业和就业市场,也肯定会因为 AI 发生巨大的变化。

曾经吃香的程序员、律师等行业,仿佛一夜间就充满了风险还是认为没有那么多程序员会失业,但是大家得改变自己的技能树。 。我们招人也不再主要看重 Ta 的学历、证书或者过往经历。而是更看重 Ta 使用什么工具,解决什么问题,有没有展示出的快速学习和构建的能力。

在某个领域学习和构建的能力是不是到位,最好的判据是你对这个领域的历史和前沿的理解有多深。

对历史融会贯通,同时又能顺应发展方向的人往往会脱颖而出:即便只是面试个市场销售的岗位。熟悉菲利普·科特勒等门派的各种框架,还会小红书抖音投放,也会大大增加你的区分度。

Attention is all you got

有了北极星,围绕它学习和构建的成本也更低了,是不是就一定能抓住北极星呢?

未必。

因为我们的机器上还装了很多别的应用。

它们中的大部分的业务模式就是识别出人的某种欲望,然后直给多巴胺,从而霸占我们的注意力。

这能有多大问题?

其实人类学上一直有所谓「thick desire」和「thin desire」的一对概念。

从 Charles Taylor 的「意义框架」到 Agnes Callard 关于「志向」的研究,很多学者一直在围绕它们开展研究工作。

想要学会如何弹钢琴和想要刷刷小红书都是欲望,当它们被满足时,都会产生快感。

区别厚实还是轻薄,最主要的判据是追求它的过程会不会给你带来显著的变化。

花了三五年终于掌握了一些钢琴,会拥有之前没有的才艺,会扩展和世界交流的方式,更重要的是,这个艰苦的过程会塑造你。

刷两小时小红书,基本上还是那个你。

人很容易选择后者是因为它们摩擦力更小。

社交媒体让人和朋友连接,却无需承担友谊的实际责任。

色情内容让人获得性满足,却无需投入关系建设的成本。

效率应用让人有成就感,却没完成什么实际的事情。

但这种没有摩擦力的世界没有给我们带来真正的满足国外有人把躺着刷手机,通过令人麻木的刺激逃避真正的意识,叫 rot,以便和 rest 做区分。

掌握一门手艺,好好看完一本书或一部电影,真正和某人建立连接或是融入某个群体,做这些需要努力的事情,会有更深刻的满足感。

所以,在新的一年里,追逐北极星不太顺利,甚至,还没有北极星,也没有关系。

给重要的人写信,编无人关注的小说,做不会上线的工具。

从这些厚重、笨拙也没有办法规模化的小事做起。

从回收自己的注意力开始。

人工智能有篇著名论文是《Attention is all your need》。

实际上,attention is all you got。