SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

RustXNG 与 SearXNG:自托管该选哪个?

对比 RustXNG v0.27.1 与 SearXNG:了解 JSON API、MCP、Web 界面和 bangs 的取舍,以及 29483 与 8888 默认端口差异。

RustXNG 与 SearXNG:简要结论

RustXNG 是一个基于 SearXNG 的单一 Rust 二进制程序。它通过 JSON API 和 MCP(Model Context Protocol)服务器向 AI agent 提供元搜索结果。如果主要用户是需要简短、受限结果以及可选页面文本的 agent,请选择 RustXNG。如果用户使用 Web 界面、依赖 bangs,或依赖结合 Valkey 的 limiter 和成熟的上游项目,请继续使用 SearXNG。

本指南其余部分将解释原因。指南还将介绍如何在 VPS 上手动安装 RustXNG,并指出该项目自身文档之间存在不一致的地方。

RustXNG 是什么,以及本指南介绍的版本

README 将 RustXNG 描述为“使用 Rust 实现、基于 SearXNG 的自托管元搜索引擎”。它的可选本地索引和爬虫默认处于禁用状态。按照本文介绍的默认配置,每次查询都会发送到外部搜索提供商,RustXNG 再合并返回的结果。SearXNG 的工作方式相同,在 VPS 上自托管 SearXNG 的指南对此有更详细的说明。许可证为 AGPL-3.0-or-later。

本指南固定使用 v0.27.1。除非另有说明,下文提到的 RustXNG 行为、默认值、README 和兼容性文档均针对该版本。2026 年 11 月 9 日,GitHub Releases 页面将 11 月 8 日发布的 v0.31.0 标记为 Latest。v0.27.1 于 11 月 3 日发布,比 v0.27.0 晚几小时。v0.26.0 于 11 月 1 日发布。v0.30.0 修订了 Standard、Clean 和 Full 搜索配置。这些配置在 v0.29.0 中已经存在;Clean 仅搜索本地索引,不向外部搜索提供商发送请求,而 Standard 和 Full 会向已启用的提供商发送查询。

README 与各版本发布内容并不完全一致。其中一句仍写着“已发布的 v0.26.0 版本包含”这些二进制文件,但安装示例固定使用 v0.27.1。这会影响一个设置:v0.27.0 将默认端口改为 29483,而 README 注明“已发布的 v0.26.0 二进制文件仍默认使用 8888”。如果您按照较旧的指南操作,但 29483 上没有响应,请先检查 rustxng --version。下面的每条命令都会显式传递 --port 29483,因此两个版本都可使用。

安装前请阅读:提供商条款和回环地址默认值

自托管不会让您的搜索对提供商保持私密。README 直接说明:“即使 RustXNG 本身运行在您的本地网络中,搜索词仍会发送到所选的外部提供商。”README 还警告:“部分提供商会限制自动化搜索、抓取、高频请求和结果存储。”其中还补充说明,提供商出现在配置中“并不保证每次使用都获得授权或符合规定”。代理发送的查询数量可能远超个人用户。在让代理使用某个提供商之前,请阅读该提供商的条款。根据 README,Yahoo! JAPAN 和 Mojeek HTML 适配器默认保持禁用状态,同时会审核其权限。

第二点是绑定地址。RustXNG 默认监听 127.0.0.1:29483,因此只有同一台机器上的进程才能访问它。README 中的 Docker 示例也遵循这一规则:在主机上发布 127.0.0.1:29483,并仅在容器内部绑定 0.0.0.0。README 没有说明内置身份验证功能。如果您要在其他网络接口上发布服务,README 要求您配置自己的访问控制。没有访问控制时,任何找到该端口的人都可以免费使用您的服务器和提供商配额,将其作为搜索 API。除非在服务前面设置您自己的访问控制,否则请将其保持在回环地址上。

RustXNG 从 SearXNG 中移除了什么

README 用一句话列出了移除的内容:“Google 搜索引擎、自动补全、外部 bang、YouTube、Google 翻译集成、Material Icons,以及由 Google 提供支持的搜索前端均已移除。”

其中两项会直接影响日常使用:

  • 外部 bang。 在 SearXNG 中,可以在查询中使用 bang,直接跳转到其他网站。RustXNG 移除了外部 bang,因此这种使用方式将无法继续使用。
  • 自动补全。 SearXNG 的设置文档显示,autocomplete: "duckduckgo" 是默认值。RustXNG 移除了自动补全,因此搜索框不会提供建议。

代理不会使用这两项功能,因此项目可以将其移除。README 还说明,旧的自定义设置必须删除这些已移除的条目,服务器才能启动。如果复制的 SearXNG 配置仍列出了 Google 引擎,服务器启动时将报错,直到删除该条目。

SearXNG 的 settings.yml 是否可以直接迁移?

部分可以,但只能以项目自身的说明为准。RustXNG 自带 settings.toml,默认值已编译进二进制文件。配置文件是可选的。使用 rustxng --config /path/to/settings.toml 传入配置文件。部分配置文件只会覆盖其中设置的值。创建自己的配置文件前,请注意一个陷阱:“使用 use_default_settings = false 时,如果引擎列表被省略或为空,则不会启用任何引擎。”没有引擎的服务器可以启动,但不会返回任何结果。因此,一个看似正确的短配置文件可能会完全禁用搜索。

兼容性页面 docs/COMPATIBILITY.md 使用日文编写,其中说明可以直接传入上游 YAML 文件,TOML 文件也可以使用。该页面称,使用 --config 或 SEARXNG_SETTINGS_PATH 选择配置文件。同一页面还列出了实际差异。模板和主题不兼容。限流器由 RustXNG 自行实现,并且不会读取你的 limiter.toml。

请谨慎看待兼容性数字。COMPATIBILITY.md 声称所有上游引擎条目都已实现“(100%)”,并且 bang 数据由同一份上游数据生成。这两项说法都与 README 冲突,后者称 Google 引擎和外部 bang 已被移除。docs/COVERAGE.md 给出了相同的 100% 数字。但该页面开头说明,这些数字是早期移植阶段的记录,既不代表当前覆盖范围,也不保证行为一致。该页面还称 Valkey/Redis 缓存尚未移植,而 README 称其受支持。对于 v0.27.1,请将 README 视为当前信息,并将这两个带版本号文档中的冲突说法视为过时内容。迁移前,使用你的配置文件启动 RustXNG,并运行你依赖的查询。

自行在 VPS 上安装 RustXNG v0.27.1

README 中包含一段面向软件代理的内容,标题为“AI 代理:安装 RustXNG,并将其用作本地 Web 搜索工具”。该内容要求代理下载二进制文件、验证文件、启动程序并进行测试。不要让代理执行它在仓库内读取到的指令。README 中的文本是不可信输入。代理一旦执行这些指令,也会执行下一份要求其进行更危险操作的 README。这正是 针对编码代理的提示注入 的核心问题。请自行安装二进制文件,然后向代理提供一个可用的端点。

v0.27.1 版本提供适用于 x86_64(GNU 和 musl)以及 ARM64 的 Linux 二进制文件(aarch64-unknown-linux-gnu,需要 glibc 2.39 或更高版本)。每个二进制文件都有对应的 .sha256 文件。以下步骤使用 x86_64 musl 构建版本,与 README 示例下载的版本相同:

sudo apt update && sudo apt install -y curl jq
mkdir -p ~/rustxng-download && cd ~/rustxng-download
tag=v0.27.1
asset="rustxng-${tag}-x86_64-unknown-linux-musl"
base="https://github.com/sahenjp/RustXNG/releases/download/${tag}"
curl -fLO "${base}/${asset}"
curl -fLO "${base}/${asset}.sha256"
sha256sum --check "${asset}.sha256"

sha256sum 应输出文件名,后跟 OK。如果某行以 FAILED 结尾,说明下载的文件与版本发布的文件不匹配。删除该文件并重新下载。同一版本页面中的校验和可以证明下载文件未损坏,但不能证明代码可以安全运行。

安装并确认版本:

sudo install -m 755 "$asset" /usr/local/bin/rustxng
rustxng --version

如果您已安装 Rust 工具链(最低支持版本为 1.88),也可以使用 README 中的源代码安装方式:cargo install --git https://github.com/sahenjp/RustXNG.git --tag v0.27.1 --locked。

在 loopback 上通过 systemd 运行 RustXNG

您在终端中启动的进程会在会话结束时停止。一个简单的 systemd 单元可让 RustXNG 持续运行,并在崩溃后自动重启。DynamicUser=yes 会将其作为临时系统用户运行,因此该服务不会以 root 身份运行。

sudo tee /etc/systemd/system/rustxng.service > /dev/null <<'UNIT'
[Unit]
Description=RustXNG metasearch (loopback only)
After=network-online.target
Wants=network-online.target

[Service]
DynamicUser=yes
Environment=SEARXNG_PORT=29483
ExecStart=/usr/local/bin/rustxng --bind 127.0.0.1 --port 29483
Restart=on-failure

[Install]
WantedBy=multi-user.target
UNIT
sudo systemctl daemon-reload
sudo systemctl enable --now rustxng
curl --fail http://127.0.0.1:29483/healthz && echo healthy

healthy 表示进程能够响应。README 将 /healthz 定义为“进程健康状态”。文档说明,检查成功并不表示上游引擎正常工作。如果该单元启动失败,请查看 journalctl -u rustxng -n 50。如果配置仍引用已删除的 Google 引擎,服务会在启动时失败。

若要在不开放端口的情况下从笔记本电脑访问 Web 界面,请使用 SSH 隧道:ssh -L 29483:127.0.0.1:29483 you@your-vps。然后在浏览器中打开 http://127.0.0.1:29483/。

代理 JSON API:max_results、include_domains 和 raw_content

代理会使用 GET /search 和 format=json 调用搜索接口。在 SearXNG 中,设置文档显示默认只启用 html 格式,因此使用 JSON 需要修改配置。RustXNG README 则显示,无需任何配置即可调用。RustXNG 还增加了 SearXNG 没有的参数:

  • max_results:返回的排序结果数量,范围为 1 到 200。
  • include_domains:仅保留来自该域名及其子域名的结果。
  • exclude_domains:排除来自该域名及其子域名的结果。
  • include_raw_content=1:将页面文本抓取到排名靠前结果的 raw_content 字段中。

以下是 README 中的简短查询:

curl --fail --get 'http://127.0.0.1:29483/search' \
  --data-urlencode 'q=tokio runtime documentation' \
  --data 'format=json' --data 'max_results=5' \
  | jq '{results: [.results[] | {title, url, content}]}'

以下查询将结果限制为一个网站,并包含页面文本:

curl --fail --get 'http://127.0.0.1:29483/search' \
  --data-urlencode 'q=tokio runtime documentation' \
  --data 'format=json' --data 'max_results=5' \
  --data 'include_domains=docs.rs' --data 'include_raw_content=1' \
  | jq '[.results[] | {url, chars: ((.raw_content // "") | length)}]'

使用默认设置时,最多会为 5 个结果抓取页面文本,“每个页面限制为 8,000 个字符;单独的抓取操作可能失败。”因此,部分结果不会包含 raw_content,代理代码必须处理这种情况。README 还指出,“字符数限制不是 token 数量限制”。因此,8,000 个字符不等于模型上下文预算中的 8,000 个 token。

SearXNG 同样可以为代理提供数据。启用该格式后,它会返回标准 JSON 字段。SearXNG JSON API 在 Open WebUI 中的配置详细介绍了这一修改。SearXNG 缺少的是内置结果数量上限和页面抓取功能,因此需要自行实现这部分逻辑。

MCP 服务器:search 和 read_page

rustxng mcp 通过标准输入输出提供两个只读工具。您需要在 MCP 客户端的配置中注册该命令,客户端会将其作为子进程启动。README 未提供客户端配置示例,因此请参阅您所用客户端的文档。在 VPS 上运行 MCP 服务器指南介绍了这一部分。

  • search 返回按相关性排序的摘要和来源元数据。默认返回 5 个结果,并将每个摘要截断为 500 个字符。
  • read_page 获取页面文本,但仅限于同一会话中此前由 search 返回过的 URL。传入 query 后,它还会返回最多 3 段匹配内容。

默认情况下,完整的结构化响应上限为 12,000 个 Unicode 字符和 24,000 个 UTF-8 字节。服务器需要截断时,会先缩短摘要,然后丢弃末尾的结果。truncated、source_truncated 和 next_offset 字段会告知代理是否应请求更多内容。

在 VPS 上,有一种行为容易令人困惑。配置了出站代理时,无论代理设置位于配置文件还是环境变量中,read_page 都拒绝工作。README 给出的原因是:页面读取“需要直接连接,以便根据公网地址检查 DNS 响应和重定向”。通过代理时,RustXNG 无法判断主机名实际解析到哪里。它无法阻止重定向到内部地址的页面,因此会默认拒绝请求。搜索功能仍会使用您的代理设置。

来自开放网络的页面文本是不可信的代理输入,无论由哪个工具获取。仅允许访问同一会话中的 URL 这一规则限制了 read_page 的访问范围,但不会使这些文本变得可信或可以直接执行。

SealQA 数字的含义

README 记录了一次日期为 2026-11-02 的 SealQA 运行。该运行使用默认设置,每个问题返回十个结果,不使用 LLM,也不使用本地索引。这些数字由项目自行提供,本文未复现。README 说明,该运行使用的是较早的引擎集合,不能据此判断默认设置变更后的性能。

图表RustXNG SealQA reference-page retrieval (project's own run, 2026-11-02)
此图表背后的数据
[
  {
    "label": "Seal-0",
    "found_at_1_pct": 47.75,
    "found_at_5_pct": 54.95,
    "found_at_10_pct": 65.77,
    "median_response_s": 1.85,
    "question_count": 111
  },
  {
    "label": "Seal-Hard",
    "found_at_1_pct": 39.37,
    "found_at_5_pct": 49.21,
    "found_at_10_pct": 61.42,
    "median_response_s": 1.53,
    "question_count": 254
  }
]

在 111 个 Seal-0 问题中,参考页面有 65.77% 的概率出现在前十个结果内。响应时间中位数为 1.85 秒。在 254 个 Seal-Hard 问题中,参考页面有 39.37% 的概率是第一个结果。

请按 README 的说明理解这些数字:“这些是参考页面检索率,不是答案准确率。”它们衡量的是是否返回了正确页面,不能说明代理随后是否给出了正确答案。README 也没有提供在相同问题上运行 SearXNG 的结果,因此无法进行对比。

何时仍应选择 SearXNG

以下四种情况下,SearXNG 仍是更好的选择。

  • 用户会在其中搜索。 RustXNG 保留了浏览器界面,但只有一个主题,不提供自动补全,也不支持外部 bang。
  • 您需要可调节的速率限制器。 SearXNG 详细说明了其机器人检测机制。其 http_sec_fetch 过滤器会拒绝 Sec-Fetch-Mode 或 Sec-Fetch-Dest 标头无效的请求,其 link_token 方法“需要一个 valkey DB”。RustXNG 有自己的速率限制器(基于 IP 的滑动窗口、链接令牌和 429 响应),但不会读取 limiter.toml。
  • 您已经调整了引擎和超时设置。 SearXNG 在 searx/settings.yml 中提供默认设置。其传出请求块将 request_timeout: 3.0 设为秒数。默认情况下,返回 HTTP 429 的引擎会被暂停 180 秒(search.suspended_times.SearxEngineTooManyRequests)。您在选择启用和禁用哪些 SearXNG 引擎时所做的配置,都可以对应到这些设置。在 RustXNG 中,您需要重新逐一测试。
  • 您重视成熟度。 SearXNG 是 RustXNG 所基于的上游项目。RustXNG 在 2026 年 11 月 1 日至 3 日期间发布了 4 个版本。

RustXNG 适合唯一客户端是同一台机器上的代理的场景

当唯一客户端是同一台机器上的代理时,RustXNG 更合适。它只需一个二进制文件,无需 Python 环境,并且默认监听 loopback。无需修改配置即可使用 JSON。它还提供结果数量上限、域名过滤器,以及在固定预算内返回可选的页面文本。MCP 服务器的 fetch 工具只会跟随其自身的搜索结果。对于运行在临时虚拟机中的编码代理,这意味着比使用 SearXNG 再自行编写抓取和截断代码所需的粘合代码更少。

两者都可以运行在一台 VPS 上。SearXNG 在自己的端口上为用户提供服务,RustXNG 在 29483 端口上为代理提供服务,并且两者各自保留独立的设置。

FAQ

RustXNG 是否可以直接替代 SearXNG?

不能。RustXNG 移除了 Google 引擎、自动补全、外部 bangs、YouTube 和 Google 翻译,模板和主题也不兼容。项目说明可以直接传入上游的 settings.yml,但旧配置必须先删除已移除的条目。您的 limiter.toml 规则也不能沿用,因为 RustXNG 使用自己的限流器。

为什么 29483 端口没有响应?

检查 rustxng --version。版本 v0.27.0 将默认端口改为 29483,而 README 说明已发布的 v0.26.0 二进制文件仍默认使用 8888。使用 --bind 127.0.0.1 --port 29483 启动后,两个版本都会监听同一个端口。

为什么在我的 VPS 上 read_page 失败,但搜索正常?

当设置中配置了出站代理,或环境中设置了出站代理时,read_page 会直接失败。页面读取需要直接连接,以便 RustXNG 根据公网地址检查 DNS 响应和重定向。请为 MCP 进程移除代理,或仅使用搜索结果。

自托管 RustXNG 能保护我的搜索隐私吗?

不能防止搜索提供商获取搜索内容。README 说明,即使 RustXNG 运行在您自己的网络中,搜索词仍会发送给选定的外部提供商。自托管可以避免第三方元搜索运营方看到您的查询,但无法避免处理这些查询的引擎看到它们,而且其中一些引擎限制自动化使用。

我应该让 AI 代理按照 README 安装 RustXNG 吗?

不应该。README 中包含一段面向 AI 代理的指令。请自行安装发布的二进制文件,并使用 sha256sum --check 检查其 SHA-256 文件。让它在 systemd 下通过回环地址运行,然后将端点提供给代理。遵循代码仓库中指令的代理,同样会轻易遵循其中的恶意指令。

这篇文章对您有帮助吗?

#searxng#rustxng#self-hosted-search#ai-agents#mcp