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

RustXNG 與 SearXNG 自架選擇指南

RustXNG 專為 AI Agent 設計,提供 JSON API 與 MCP 工具;SearXNG 則適合網頁瀏覽與依賴 bangs 功能的場景。本文分析 v0.27.1 版本差異與安裝注意事項。

RustXNG 與 SearXNG:簡短回答

RustXNG 是一個基於 SearXNG 的單一 Rust 二進位執行檔,透過 JSON API 與 MCP (Model Context Protocol) 伺服器為 AI Agent 提供元搜尋結果。若您的主要使用者是需要簡短、受限結果及選擇性網頁文字的 Agent,請選擇 RustXNG。若您的使用者透過網頁介面操作、依賴 bangs 功能,或是需要使用 Valkey 進行限制並仰賴成熟的上游專案,請保留 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,因此兩個版本都能使用。

安裝前須知:供應商條款與 loopback 預設值

自架服務並不會讓您的搜尋對供應商隱匿。README 已明確指出:「即使 RustXNG 運行在您的區域網路中,搜尋字詞仍會發送至選定的外部供應商。」文件中亦警告:「部分供應商限制自動化搜尋、爬取、高流量請求及儲存搜尋結果」。此外,將供應商列入設定檔「並不保證每次使用皆符合授權或規範」。代理程式發送的查詢量遠高於一般使用者。在將代理程式指向特定供應商前,請務必閱讀該供應商的條款。根據 README,Yahoo! JAPAN 與 Mojeek 的 HTML 轉接器預設為停用,待權限審核完成後方可使用。

第二點是綁定位址。RustXNG 預設監聽 127.0.0.1:29483,因此僅有同一台機器上的處理程序能存取它。README 中的 Docker 範例亦維持此規則:它將 127.0.0.1:29483 發佈至主機,並僅在容器內部綁定 0.0.0.0。README 中未提及內建驗證機制。若您將服務發佈至其他介面,請務必自行設定存取控制。若無防護,任何發現該連接埠的人皆可使用您的伺服器,並將您的供應商配額當作免費的搜尋 API 使用。除非您已在前端部署存取控制,否則請務必維持在 loopback 介面上。

RustXNG 從 SearXNG 中移除了哪些功能

README 在一句話中列出了移除項目:「Google 搜尋引擎、自動完成、外部 bangs、YouTube、Google 翻譯整合、Material Icons 以及由 Google 支援的搜尋前端皆已移除。」

其中兩項會改變使用者的日常操作:

  • 外部 bangs。 在 SearXNG 中,查詢中的 bang 可將您直接導向其他網站。RustXNG 移除了外部 bangs,因此該習慣將無法繼續運作。
  • 自動完成。 SearXNG 的設定文件顯示 autocomplete: "duckduckgo" 為預設值。RustXNG 移除了自動完成功能,因此搜尋框不會提供任何建議。

代理程式(agent)不會使用上述任一功能,因此該專案可以將其捨棄。README 同時指出,在伺服器啟動前,必須先刪除舊版自訂設定中已移除的項目。若您複製了仍列有 Google 引擎的 SearXNG 設定檔,請預期會發生啟動錯誤,直到您移除該項目為止。

SearXNG 的 settings.yml 能直接沿用嗎?

部分可以,但僅以專案本身的說明為準。RustXNG 隨附 settings.toml,其預設值已編譯至二進位檔。設定檔是選用項目,使用 rustxng --config /path/to/settings.toml 傳入。部分設定檔只會覆寫其中指定的值。建立自己的檔案前,請先注意一個陷阱:「使用 use_default_settings = false 時,省略或留空 engine 清單會停用所有 engine。」沒有任何 engine 的伺服器仍會啟動,但不會回傳結果。因此,看似正確的精簡設定檔可能會完全停用搜尋功能。

相容性頁面 docs/COMPATIBILITY.md(以日文撰寫)表示,可以直接傳入上游 YAML 檔案,也支援 TOML。該頁面說明,使用 --config 或 SEARXNG_SETTINGS_PATH 可選取檔案。同一頁也列出實際差異。Templates 和 themes 不相容。Limiter 採用 RustXNG 自行實作的版本,不會讀取你的 limiter.toml。

請謹慎解讀相容性數字。COMPATIBILITY.md 宣稱已實作所有上游 engine 項目「(100%)」,且 bang 資料是由相同的上游資料產生。這兩項說法都與 README 衝突,因為 README 表示 Google engines 和 external bangs 已移除。docs/COVERAGE.md 也列出相同的 100% 數字。但該文件開頭說明,這些數字是較早移植階段的紀錄,不代表目前的涵蓋範圍,也不保證行為一致。該文件也表示尚未移植 Valkey/Redis cache,但 README 則表示已支援。針對 v0.27.1,請以 README 的內容視為目前狀態,並將這兩份具版本標記文件中的矛盾說法視為過時資訊。移轉前,請使用你的設定檔啟動 RustXNG,並執行你所依賴的查詢。

自行在 VPS 上安裝 RustXNG v0.27.1

README 包含一個針對軟體編寫的區塊,標題為「AI 代理:安裝 RustXNG 並將其作為本地網路搜尋工具」。它指示代理下載二進位檔、進行檢查、啟動並測試。請勿讓代理程式執行其在儲存庫中讀取的指令。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。

在 systemd 下以 loopback 執行 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 引擎,則會在啟動階段失敗。

若要從筆記型電腦存取網頁介面且不開啟連接埠,請使用 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 欄位。Open WebUI 的 SearXNG JSON API 設定 一文詳細說明了此變更步驟。SearXNG 缺乏內建的結果上限與頁面擷取功能,因此您需自行實作該部分。

MCP 伺服器:search 與 read_page

rustxng mcp 透過 stdio 提供 2 個唯讀工具。您需要在 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 上,有一項行為容易令人意外。設定或環境中配置對外連線 proxy 時,read_page 會拒絕運作。README 說明原因:頁面讀取「需要直接連線,才能確認 DNS 回應與重新導向是否指向公開位址」。透過 proxy 時,RustXNG 無法得知主機名稱實際解析到的位置。它無法封鎖重新導向至內部位址的頁面,因此會採取預設拒絕的方式處理。搜尋功能本身仍會使用您的 proxy 設定。

來自公開網路的頁面文字都是代理程式的不受信任輸入,無論是由哪個工具取得。僅允許使用同一工作階段中的 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 的說明解讀這些數據:「這些是參考頁面檢索率,不是答案正確率。」它們衡量的是正確頁面是否被傳回,不表示 agent 之後是否能正確回答。README 也沒有提供在相同問題上執行 SearXNG 的結果,因此無法進行比較。

何時仍應選擇 SearXNG

以下四種情況,SearXNG 仍是較好的選擇。

  • 使用者會在其中搜尋。 RustXNG 保留瀏覽器介面,但只有單一主題,沒有自動完成,也沒有外部 bangs。
  • 你需要可調整的限制器。 SearXNG 詳細說明其機器人偵測功能。其 http_sec_fetch 篩選器會拒絕包含無效 Sec-Fetch-Mode 或 Sec-Fetch-Dest 標頭的請求,而其 link_token 方法「需要 valkey DB」。RustXNG 有自己的限制器(IP 滑動視窗、連結 token 與 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 個版本。

當 agent-first 二進位檔勝出時

當唯一的客戶端是同一台機器上的代理程式時,RustXNG 表現更佳。您只需一個不依賴 Python 環境的二進位檔,預設監聽 loopback 介面。無需修改設定即可使用 JSON。您還能獲得結果上限、網域過濾器以及預算固定的選擇性頁面文字功能。MCP server 的 fetch 工具僅會追蹤其自身的搜尋結果。對於運行在 拋棄式 VM 中的程式設計代理而言,這意味著比結合 SearXNG 與自行編寫的 fetch 及截斷程式碼所需的膠水程式碼更少。

兩者皆可運行於同一台 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 啟動,即可讓兩個版本監聽相同的埠。

為什麼搜尋功能正常,但 read_page 在我的 VPS 上失敗?

當設定檔或環境變數中配置了對外代理伺服器時,read_page 會關閉連線。頁面讀取需要直接連線,以便 RustXNG 針對公開位址驗證 DNS 回應與重新導向。請移除 MCP 程序所使用的代理伺服器,或僅使用搜尋結果。

自架 RustXNG 能確保搜尋隱私嗎?

無法對搜尋服務提供商隱私。README 指出,即使在您的網路中執行 RustXNG,搜尋字詞仍會傳送至選定的外部提供商。自架僅能避免第三方元搜尋營運商取得您的查詢紀錄。這無法對回應查詢的搜尋引擎隱藏您的資訊,且部分引擎會限制自動化存取。

我應該讓 AI 代理程式依照 README 安裝 RustXNG 嗎?

不應該。README 包含一組針對 AI 代理程式的指令。請自行安裝發佈的二進位檔,並使用 sha256sum --check 驗證其 SHA-256 檔案。在 systemd 下以 loopback 模式執行,再將端點提供給代理程式。會遵循儲存庫指令的代理程式,同樣會輕易執行惡意指令。

這篇文章對您有幫助嗎?

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