使用开源的 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 的访问做了根本性的限制,毕竟加密、高效、速度快,那么防火墙的审查也是很困难。

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

ChatGPT 只会让工作更多更累更繁重

马克思和马斯克都预言人类未来不用再工作,但我觉得应该不会早于耶稣第二次来地球。

自从开始用大语言模型(Llm)的工具,我的工作效率的确有很大提升。

我是做海外业务的,以前我还会把文档用 OmegaT 这样的翻译工具配合微软或者谷歌的翻译 API,一行一行手动修正翻译成中文或者是英文以提供给公司内部或者客户查看或使用;现在,短小的 docx 文档能用 Word 的功能直接翻译,PDF 或者其他类型的文档,我会丢给类似 oTranslator 这样的大语言模型代理工具,配合上一点提示词,选用合适的模型就能搞定,无非就是付一点不多的成本。以往看到就知道要花上好几天,心里产生抵触情绪以至厌烦的翻译工作,现在点击几下,喝杯咖啡,转头就能获得不错的结果,用于不那么严肃的技术、商务沟通场合,同事、客户都反响不错。

甚至从去年以来,我和讲西班牙语的客户的邮件往来基本都由大语言模型代劳:客户的邮件使用便宜、快速的模型翻译以理解客户意图,再用英文写回复,配合相对高级的思考型模型配合我定义的语言风格翻译成西班牙语。虽然以前通过谷歌翻译就能实现,但机器翻译的流畅程度还是远差于大语言模型。

再来就是客户开发与冷电话(Cold Call)沟通。最早 GPT-4 不具备联网搜索功能的时候,我尝试部署 Open-WebUI 这样的工具配合谷歌搜索 API 进行结合 RAG 功能筛选,效果非常差——单次搜索价格时间成本很高,精度又不理想。调用 API 的成本很快就会随着使用的增加变成不愿承担的负担。尝试过 ChatGPT、Copilot 这样的工具,搜索结果又不十分理想,只能又回到手动搜寻,反而效率更高。直至前段时间,参与 PayPal 的活动免费拿了一年 Perplexity 的使用权,配合我定义的提示词,一天之内我能定位 3-5 家目标公司联系人,并拟定下接触计划,配合自己部署的客户管理系统 Twenty,按计划进行接触和记录就可以,以往需要一两周才能定下的工作,效率的确有了极大的提升,我明年付费使用 Perplexity 也是一定了的。

是的,大语言模型工具已经完全改变了我的工作模式和方法,效率提升极大,使我用更短的时间完成了更多的工作,似乎马斯克声称的只需要少数人工作的未来似乎并不遥远。

但马斯克终究是亿万富翁,没打过工也没缺过钱,站在亿万富翁的角度为大众思考为什么还需要工作的论述,就像晋惠帝司马衷思考为什么民众不喝肉汤一样匪夷所思。同样匪夷所思的还有马斯克的拥趸——大抵是只有没真正打过工的人才会相信效率的提升会造福普通人。

以我对商业粗浅的理解,职场工作效率提升之后更有可能发生这样的事情——

  • 投资者发现单位员工产出上升,快速将工具部署到每个员工;
  • 员工效率提升,推动公司业绩上扬;
  • 人力资源成本核算发现,效率提升可以用更少的人做同样多的事情,或者同样多的人增加更多的事情;
  • 管理人员轻松做出决策,通过裁员降低成本并维持同样业绩收入,提升利润率,或者要求所有员工提高效率以提高收入,并裁掉不能应用新工具的低效率员工;
  • 作为结果,投资人获得了更多的回报,而员工得到的是同样的收入和更多的工作,并面临更激烈竞争的情况甚至导致收入更低。

的确有人不用再工作了——高效率的员工会帮助已经很有钱的投资人更加有钱,并推动部分高收入人群也加入这个不用工作的群体。如果你也在那部分人群里,那么想象一个没有人需要工作的世界也不是那么的难,只不过这个世界是基于剥削另一个世界的员工创造的。

我们正在这条路上越走越远。亚马逊最近的 14,000 个岗位的裁撤(作为 30,000 个岗位裁撤的一部分)无疑是最新的一例证据。随着巨富变得更富,我们可以预期有庞大声势和资源的那些人的道德和趣味会进一步脱离大众,并因媒体资源传播导致被剥削群体莫名其妙地拥护他们,形成低收入群体维护巨富群体的奇怪场面,仿佛回到了封建时代农奴对领主感恩戴德的道德观。

作为普通业务员,在预期可见的未来,我会继续使用提高效率的工具——毕竟的确让我在工作上更游刃有余。就像学会了开车,没有必要骑自行车周游世界,有更趁手的工具在手,非要扔掉好用是在是不符合逻辑;但如果因此非要嘲笑没有工具效率低的人跟不上时代,而没有认清自己也迟早是会被淘汰的,那么我们只不过是被困在在弱肉强食的世界里为资本创造价值。

ChatGPT 让我们的工作更多、更累、更繁重的情况已经开始蔓延。马斯克预言所有人会因 AI 享有同等高收入的未来让人遐想,但恐怕和马克思的理论一样难以实现。作为普通人,还不如期待一下有生之年看到耶稣再到地球。

WordPress 使用 X.509 验证连接数据库

一个文件解决 WordPress 原生不支持 X.509 验证连接数据库的功能缺失。

大部分的 WordPress 教程都是建议所有服务都放在同一台服务器上,作为入门使用当然足够,但随使用增多,有如下问题:

  • 一台服务器跑所有的服务,如果有多个网站,如果(因预算不高导致购买的)服务器资源不足容易导致响应速度变慢;
  • 多个网站放在不同的服务器上,每个服务器带个数据库都需要单独管理,反而增加维护复杂性。

因此将数据库在一台相对较轻量的服务器上单独运行,在数据访问频率不高、数据库非常小的情况下足够应付多个小型博客网站的架设。(在预算有限又不能内网访问的情况下)公网访问 MySQL 必然需要加密通讯,否则明文访问数据库有如裸奔,还不如不要独立的数据库了。

WordPress 长久以来(点击这里查看来源)支持 SSL 验证访问数据库,通过在 wp-config.php当中定义define( 'MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL );即可。但 SSL 验证方式仅客户端验证服务器的证书,服务器并不验证客户端证书——传输过程确实是加密了,但服务器无法验证客户端是否合法,那么假如你的数据库用户密码泄漏,SSL 验证便形同虚设。因此,在生产环境中,使用 X.509 验证,强制服务器也验证客户端证书,即便密码泄漏,证书不泄漏,数据库就是安全的。

不幸的是,WordPress 并不直接支持 X.509 验证。虽然 WordPress 开发社区十一年前已提出该问题,但相比于可见的功能性更新,这个需求并没有引起重视。

为了更安全的连接,WordPress 开发社区志愿者写了db.php 功能增强代码。基于其代码,通过时下流行的 Gemini 2.5 Pro 和 Claude Sonnet 4.5 的帮助,我组装了一个 db.php,用于 WordPress 与数据库进行 X.509 验证。本博客使用 X.509 与数据库连接。

使用方法如下:

1. 下载 db.php 并将其移动到 WordPress 程序目录下的/wp-content目录:

wget https://raw.githubusercontent.com/rebelliouswhiz/wp-secure-db/refs/heads/main/db.php

2. 修改 WordPress 目录下的wp-config.php,在/* That's all, stop editing! Happy publishing. */行前添加如下内容:

define( 'MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL );
define( 'MYSQL_SSL_KEY', '/path/to/your/client-key.pem' );
define( 'MYSQL_SSL_CERT', '/path/to/your/client-cert.pem' );
define( 'MYSQL_SSL_CA', '/path/to/your/ca-cert.pem' );

// 必须,否则会回退到 SSL 连接,不设置则默认为 true
define( 'MYSQL_SSL_VERIFY_SERVER_CERT', true );

// 可选,用于 SSL 加密算法
define( 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256' );

3. 确保db.php的权限正确:chmod 755 db.php

数据库侧也需要设置用户仅能通过 X.509 验证连接,并确保 MySQL 启动设置强制要求 SSL 连接。

使用代码可能会导致插件安装的问题,也会导致 W3 Total Cache 的数据库缓存不可用,请在使用前确保无冲突。

VAIO、TOSHIBA 等日系笔记本电脑更换无线网卡无法启用的解决方案

解决更换笔记本网卡,系统无法启用/识别的问题。

本文解决方案参考自 thecomputerperson 博客:thecomputerperson.wordpress.com

我有一台 VAIO S11 笔记本电脑,多年前买的。Wi-Fi 6 的 Intel AX200 网卡出来之后,就一直想着更换笔记本原来的老旧 Bluetooth 4.2 和 Wi-Fi 5 网卡。

经过查询对比购买、拆机、安装之后的 Intel 网卡,可以看到笔记本检测得到,驱动能正常安装,但是无论 BIOS 设置还是 Windows 内设置都无法正常启用 Wi-Fi,笔记本上也没有相应的物理开关操作。

经过多轮查询、尝试之后,thecomputerperson 的办法成功让我正常使用这张 AX200 网卡。

原理

日系或者相对老一点的笔记本电脑通常对网卡芯片有些奇怪的限制,这种限制我无法通过官方文件证实,但是确实有这样的现象。

原理应当是通过主板或者 BIOS 的控制,限制能够启用的硬件。个别供应商会配合开发商提供特殊的硬件,以此确保硬件的可控性。

本解决方案通过屏蔽网卡相应的针脚,欺骗硬件/软件,使得 Wi-Fi 网卡能启动,并被系统正常调用。

操作

剪一条小小的胶带,正好把下图的两个 PIN 脚遮盖住,插上即可。

注意 PIN 脚的方向,否则黏上了也没有用。只覆盖这一面的两个针脚,另一面无需覆盖。