使用开源的 Anubis 应对 Llm 及互联网爬虫

自从用上了 Anubis,网站访问数据再也没上升过了。这对自信是一个巨大的挑战。

自从 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 就可以正常访问。

跨境网站不要用 HTTP/3 和 QUIC

帮你省下 20+ 小时:我已经尝试过了,真的不行。

大家都说 HTTP/3 好。HTTP/3 确实好,基于 QUIC 协议加密、高效、速度快。但前提条件是 QUIC 协议没有被限制。

经过长时间测试,及至少 20 小时的服务器、防火墙调试测试,我得出结论:如果服务器在国外,HTTP/3 启用会导致国内访问间歇性出现问题。

如果你HTTP/2 访问没有问题,但是 HTTP/3 总是有故障,不要折腾了,HTTP/2 没什么不好的;如果使用 Cloudflare CDN,也不要开启 HTTP/3,否则一样会出现类似的问题。

我在 v2ex.com 提出了这个问题,以及在互联网上也找了很多相关资料,很多人会归结为 QoS。我觉得这可能不准确,QoS 只会限制访问,具体体现在丢包和带宽限制;但是服务器普通 UDP 包并没有丢包,iperf3 测速也正常。我推测防火墙可能对 QUIC 的访问做了根本性的限制,毕竟加密、高效、速度快,那么防火墙的审查也是很困难。

别调试了,把重点放在内容和业务上吧。