如何自行代管 SearXNG 私人搜尋引擎
使用 Docker Compose 在 VPS 建立私人 SearXNG,設定 settings.yml、limiter 與 nginx TLS,並啟用 JSON 搜尋 API,供自己的指令碼呼叫。
你要建置的內容
自行代管 SearXNG,即可在自己的伺服器上執行私人搜尋引擎。SearXNG 是中繼搜尋引擎:它會接收你的查詢,向 Google、Bing、DuckDuckGo 和 Wikipedia 等其他引擎發出請求,再將回傳結果整合到單一結果頁面。系統不會建立個人檔案,也不會設定追蹤 Cookie,因為唯一保存你查詢內容的機器就是你的伺服器。
這個堆疊很精簡。只需要 2 個容器、1 個設定檔和 1 個反向 Proxy。真正需要決定的是執行個體要設為私人,表示只有你和自己的指令碼可以存取;還是設為公開,表示網際網路上的任何人都能查詢。這項選擇會改變安全性設定,因此請在輸入任何內容前先決定。預設答案是私人。
執行自己的執行個體還有另一個理由。SearXNG 執行個體提供 JSON,因此你撰寫的任何指令碼或 AI 代理程式,都能使用由你控制的搜尋 API,不需要金鑰、不會按查詢次數計費,也不會收到配額通知郵件。
使用 Docker Compose 安裝 SearXNG
此專案會發布容器映像檔和 Compose 檔案。將兩者擷取到已安裝 Docker Engine 和 Compose 外掛程式的全新 Ubuntu 24.04 伺服器。如果你不熟悉 Docker,請先閱讀 VPS 上的 Docker Compose 基礎,再回到這裡。
sudo install -d -o "$USER" -g "$USER" -m 750 /opt/searxng
cd /opt/searxng
mkdir -p core-config
curl -fsSL \
-O https://raw.githubusercontent.com/searxng/searxng/master/container/docker-compose.yml \
-O https://raw.githubusercontent.com/searxng/searxng/master/container/.env.example
cp -i .env.example .envCompose 檔案定義了兩個服務。core 是 SearXNG 本身,valkey 是用於速率限制和短期狀態的記憶體內資料存放區。它會將 ./core-config/ 掛載到容器內的 /etc/searxng/,因此你設定的所有內容都位於主機上的同一個目錄。
現在編輯 .env。發布的範例中每一行都被註解掉,因此容器會在所有位址的連接埠 8080 上啟動。取消註解並設定以下三項。
SEARXNG_VERSION=latest
SEARXNG_HOST=127.0.0.1
SEARXNG_PORT=8080SEARXNG_HOST=127.0.0.1 是重要設定。它會讓發布的連接埠使用 127.0.0.1:8080:8080,而不是 [::]:8080:8080,因此容器只會回應迴圈位址,網際網路無法直接連線到它。如果略過此設定,容器一啟動就會暴露,因為發布的 Docker 連接埠會插入在防火牆規則之前。這個陷阱值得完整閱讀:已發布的 Docker 連接埠會繞過 ufw。
在學習期間,SEARXNG_VERSION=latest 已足夠。在重要的伺服器上,請固定標籤。截至 2026 年 7 月,發布標籤採用日期格式,看起來像 2026.3.25-541c6c3cb。如此一來,部署會在你決定時升級,而不是在 registry 變更時自動升級。
settings.yml:重要設定
在第一次啟動前建立 core-config/settings.yml。use_default_settings: true 會指示 SearXNG 載入隨附的預設值,然後只套用您寫入的設定,因此檔案可以保持精簡,也能在升級新增選項時繼續使用。
先產生密鑰,因為該值會直接寫入檔案。
openssl rand -hex 32use_default_settings: true
general:
instance_name: "search.example.com"
server:
base_url: "https://search.example.com/"
secret_key: "paste-the-openssl-output-here"
limiter: false
public_instance: false
image_proxy: true
valkey:
url: valkey://valkey:6379/0
search:
safe_search: 0
autocomplete: "duckduckgo"
formats:
- html
- jsonsecret_key 用來簽署工作階段和權杖資料。隨附的預設值是字串 ultrasecretkey。如果保留這個值,任何知道該預設值的人都能偽造這些權杖。請替換一次,之後不要再變更:之後變更會捨棄所有已儲存的偏好設定。
base_url 必須是公開的 HTTPS 位址,且結尾要有斜線。SearXNG 會將此位址寫入產生的連結。若保留指向 localhost,遠端瀏覽器中的「下一頁」連結會指向讀者自己的電腦,因而失效。
formats 決定網頁端點會產生哪些輸出類型。json 不在預設清單中,因此加入它之前,JSON 請求會回傳 403。image_proxy: true 會透過您的伺服器轉送結果縮圖,因此託管這些圖片的網站不會看到訪客的位址。
valkey.url 使用主機名稱 valkey,因為這是 Compose 檔案中的服務名稱,而 Compose 會將兩個容器放在同一個網路上,讓服務名稱可以解析。請勿將它指向 localhost,否則限制器會失效,因為在 core 容器內,localhost 指的是該容器本身。
密鑰位於純文字檔案中,因此應保護其所在的目錄,而不是只保護檔案本身。chmod 750 /opt/searxng 可防止主機上的其他使用者存取。請勿將 core-config/settings.yml 收緊為模式 600:容器會以自己的非特權使用者執行,而無法讀取的檔案會使 SearXNG 完全無法啟動。
啟動堆疊並檢查狀態。
cd /opt/searxng
docker compose up -d
docker compose ps
curl -I http://127.0.0.1:8080/docker compose ps 應顯示兩個容器的狀態都是 running。curl 應回應 HTTP/1.1 200 OK。如果沒有回應,請讀取 docker compose logs core,因為 settings.yml 中的 YAML 錯誤會在其中顯示指出行號的剖析錯誤。
透過 nginx 搭配 TLS
容器僅在 loopback 上接聽,因此必須使用 nginx 讓外部可以連線,並由 nginx 加入傳輸層安全性(TLS)。寫入 /etc/nginx/sites-available/searxng。
server {
listen 80;
server_name search.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}sudo ln -s /etc/nginx/sites-available/searxng /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d search.example.comnginx -t 會在重新載入前輸出 syntax is ok 和 test is successful。Certbot 會改寫同一個檔案,使其在 443 上使用憑證接聽,並新增從連接埠 80 的重新導向。search.example.com 的 DNS 記錄必須已指向此伺服器,因為憑證授權單位會透過 HTTP 擷取檔案,以驗證擁有權。完整操作流程(包括續期)請參閱 Ubuntu 24.04 的 Certbot 與 nginx 指南。
這兩個轉送標頭並非裝飾。缺少 X-Forwarded-For 和 X-Real-IP 時,抵達 SearXNG 的每個要求都會帶有 proxy 位址。因此,速率限制器會將所有流量視為來自同一個用戶端,無法區分訪客。
為什麼指令碼和代理程式需要 JSON 搜尋 API
在 formats 中使用 json 後,負責呈現頁面的相同端點也會傳回結構化資料。
curl -s 'http://127.0.0.1:8080/search?q=wireguard+mtu&format=json' \
| jq -r '.results[0:5][] | .url'您會取得一個包含 results 陣列的物件。每個項目都包含 url、title、content 以及提供結果的引擎,同時還有 answers、infoboxes 和 suggestions。這些資料足以提供給摘要工具、連結檢查器或研究迴圈使用。
這對任何具備代理程式特性的工具都很重要。語言模型有訓練資料截止日期,因此需要即時搜尋才能回答目前的問題;商用搜尋 API 則會按查詢次數收費,且通常有嚴格的速率限制。在您已經付費使用的伺服器上執行一個本機執行個體,只需額外使用一個容器,而且查詢不會離開該伺服器。如果您要將工具連接至模型,同樣的考量也適用於在 VPS 上執行 MCP 伺服器;搜尋工具通常是人們最先加入的工具。
使用 API 時請遵守兩項規則。請保持執行個體為私有,將 API 端繫結至迴路位址或私有網路,只允許您自己的主機連線。接著,請以適當頻率查詢。SearXNG 會將您的請求轉送至實際的搜尋引擎,因此每秒執行一百次查詢的指令碼,等同於要求 Google 封鎖您的伺服器。
限流器,以及公開執行個體的變更
限流器是 SearXNG 的機器人防護機制。它會監控要求標頭、位址和要求速率,並丟棄看起來由自動化程式產生的網路流量。它需要 Valkey 儲存這些狀態,因此 Compose 檔案會一併提供 Valkey。
在私人執行個體上,請保留 limiter: false。根據定義,您自己的指令碼會產生自動化流量,因此限流器會封鎖您建立此執行個體時所需的 JSON 呼叫。存取控制應由反向代理負責:在 nginx location 中設定 allow 和 deny,使用 HTTP 基本驗證,或設定僅允許其他伺服器連入的防火牆。
如果您要讓其他人使用此執行個體,請開啟這兩個開關。
server:
limiter: true
public_instance: true更細緻的控制設定位於 core-config/limiter.toml,容器會從 /etc/searxng/limiter.toml 讀取該檔案。您只需寫入要變更的索引鍵。使用代理時,必須宣告該代理,否則限流器會將 nginx 的位址視為唯一的濫用用戶端。
[botdetection]
trusted_proxies = [
'127.0.0.0/8',
'::1',
]
[botdetection.ip_limit]
link_token = truelink_token = true 會讓 SearXNG 發出只有真正的瀏覽器工作階段才能取得的權杖,藉此阻擋大多數簡單的擷取程式。預期公開執行個體在數天內就會吸引這些程式。也要預期引擎錯誤,因為您轉送的網路流量越多,上游引擎就越快開始向您的伺服器位址傳回 CAPTCHA。公開的 SearXNG 執行個體需要持續維護。私人執行個體則不需要,因此它會列在大多數 2026 年值得自行代管的項目 短名單中。
搜尋沒有結果的原因
在您的執行個體上開啟 /stats。其中會列出每個引擎的錯誤率和回應時間。當搜尋結果過少時,應先查看此頁面。
顯示「Access denied」或「CAPTCHA」錯誤的引擎,表示其封鎖了您的伺服器位址。資料中心網段中的位址經常發生此情況,因為搜尋引擎會假設這些位址屬於爬蟲。SearXNG 隨後會暫停使用發生錯誤的引擎一段時間,而不是重試。因此,單一引擎遭封鎖後,會在不明顯的情況下退出搜尋結果。您可以在 settings.yml 中停用該引擎,或接受此損失。其餘引擎仍會回應。
如果所有引擎同時失敗,表示容器沒有可用的對外名稱解析,或沒有通往網際網路的路由。請從容器內進行測試。
docker compose exec core wget -qO- https://duckduckgo.com > /dev/null && echo okFAQ
SearXNG 會讓我的搜尋匿名嗎?
它會對所查詢的搜尋引擎隱藏您的身分,因為這些引擎看到的是您的伺服器發出請求,而不是您的瀏覽器。它不會對您的伺服器隱藏查詢內容,也不會對這些引擎隱藏您的伺服器。在單一使用者執行個體中,來自該位址的所有流量都屬於您,因此該位址本身會成為識別資訊。您的瀏覽器與執行個體之間的流量會受到 TLS 憑證保護。
為什麼 JSON 請求會傳回 403 Forbidden?
原因有兩個,而且都與組態設定有關。第一種情況是 json 未列在 settings.yml 中 search: 下的 formats 清單內,這是預設狀態。第二種情況是限制器已啟用,並將您的指令碼判定為機器人。先加入該格式,再使用 docker compose restart core 重新啟動,然後重試。如果仍然失敗,請設定 limiter: false,改在反向代理上控管存取權限。
如果停用限制器,還需要 Valkey 容器嗎?
請讓它持續執行。SearXNG 沒有它也能運作,但若沒有它,之後無法啟用限制器,而且它也會保存其他短期狀態。該容器很小,只儲存快取資料;移除它幾乎節省不了任何資源,卻會失去日後啟用限制器的選項。
如何更新 SearXNG?
在 /opt/searxng 中執行 docker compose pull,然後執行 docker compose up -d。Compose 會重新建立映像檔已變更的容器,並保留您的 core-config/ 目錄不變,因此 settings.yml 會繼續存在。由於 use_default_settings: true 會以您設定的鍵值覆寫發布版本的預設值,上游新增的選項會以合理值加入,而不會導致檔案失效。
多人可以共用同一個執行個體嗎?
可以;這種情況下應啟用限制器並設定 public_instance: true。偏好設定會儲存在每位訪客自己的瀏覽器中,因此不需要管理帳戶。開放使用後,請持續監控 /stats 一週,因為上游搜尋引擎通常早在您注意到搜尋結果缺失之前,就會開始拒絕您的伺服器。