自从 ChatGPT 以及各种 Llm 的工具的兴起,各种各样的网站都不断地被爬虫读取数据:更多更好的数据(大体上)意味着更大更好的模型。但网站不断地被爬虫爬取数据意味着真人想要访问网站就会受到影响,人用浏览器是不可能比不断发起请求的爬虫更快访问网站的。
我喜爱的开源路由器系统 OpenWrt 的网站也受到巨大影响,所有的 Llm 几乎都想要爬遍 OpenWrt 的每一条帖文,导致大量的 Wiki 和下载页面不可用。今年 4 月份,我在 OpenWrt 论坛建议要不要上 Anubis 来阻止爬虫;当时管理员觉得还用不上,现在你登录 https://openwrt.org 已经能见到 Anubis 的小豺狼了(不是狐狸,Anubis 作者 Xe 确认是 Jackal 豺狼)。

Anubis 的原理是让有风险的访问流量强制执行 JavaScript 代码并进行本地运算,运算失败的流量就会被禁止访问网站内容(作者用 “度量每次连接的灵魂重量” 幽默地解释其设计)。考虑到大部分的爬虫不能运行 JavaScript 代码,也不会分配那么多的计算资源,这个聪明的设计足以挡住大部份不合法流量。
虽然也有人指出华为的爬虫已经可以进行 JavaScript 验证,可以预计未来随着算力的增加,爬虫分配的计算资源也会越来越多;但所谓道高一尺魔高一丈,可以预期未来 Anubis 也会进一步进行升级,有心的朋友可以前往 GitHub,付费支持 Xe 的开发。
基本的配置看其文档就可以搞定,我选择的是本地安装,对我来说会比 Docker 安装更为顺手;我另外想要分享一下监听 unix 而不是 127.0.0.1 可能遇到的一些问题。
unix 监听会比 localhost 监听减少一些 TCP 连接的开销。虽然实际开销(本地连接几乎无延迟、带宽问题)相比起名义开销(最高可能有 50%)其实可以忽略不计,但因为想要省钱,便宜的服务器的资源当然是能省就省。
首先,TARGET 的写法在教程中说是 unix:///path/to/socket.sock,但其实不用那么多斜杠,就可以。unix:/path/to/socket.sock
其次,默认的 Anubis Systemd 服务文件会把 unix 监听文件的权限写成 anubis:anubis,如果你的 Nginx 的用户是 www-data,那么你是无法读取 unix 文件而导致访问 502 问题。考虑到 Anubis 的升级,直接更改 systemd 文件不可取,但是可以通过systemctl edit anubis@修改所有实例的启动文件:
### Anything between here and the comment below will become the new contents of the file
[Service]
DynamicUser=no
User=www-data
Group=www-data
### Lines below this comment will be discarded
这样,当你systemctl enable --now anubis@your.service创建新的实例的时候,unix 文件就会创建所有权为www-data:www-data,www-data 用户的 Nginx 就可以正常访问。
