使用Docker + Nginx架設SearXNG。
想要擁有一個客製化的搜尋引擎嗎?SearXNG這款軟體可以協助您達成目的。
SearXNG是為「元搜尋引擎」,透過代理伺服器的方式,整合各大搜尋引擎的結果,請求過程中你的裝置資料會被匿名處理,能確保使用者隱私不被搜尋引擎供應商侵犯。
Ivon在這篇文章介紹過如何使用SearXNG取代Google各大搜尋引擎,並簡介了它的優缺點。
但公共站台最大的問題,果然還是回應速度和細部設定讓人不滿意吧,且隱私權不見得有保障,雖然SearXNG搜尋是匿名的,誰知道他們伺服器會不會記錄你的搜尋結果呢?
那麼何不自架SearXNG站台呢?這樣您就可以客製化搜尋引擎外觀,設定自動重導向、從搜尋結果過濾特定網站啦。
甚至不需要購買VPS,只需要在裝有Docker的電腦就可以輕鬆架起一個私人SearXNG站台!搜尋紀錄全部由您自己保管!

這個過程叫做Self-hosting a SearXNG instance。本文Ivon將使用Docker在電腦架設SearXNG服務,開機自動啟動後就不用管他了。
1. 設定docker-compose#
SearXNG支援AMD64/ARM64/ARMv7架構的機器。它是個輕量的搜尋引擎。硬體資源需求不高,只要512MB RAM就能跑。
在Linux電腦安裝Docker
取得SearXNG容器的範本檔案,內含SearXNG與valkey資料庫。
cd ~
mkdir -p ./searxng/core-config/
cd ./searxng/
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 .env - 編輯
.env檔案:
SEARXNG_VERSION=latest
# 網址,若沒有使用反向代理就改為0.0.0.0
SEARXNG_HOST=127.0.0.1
# 容器內部使用的通訊埠,要修改對外曝露的通訊埠,編輯docker-compose.yml
SEARXNG_PORT=8080- 啟動容器
docker compose up -d瀏覽器開啟網址
http://localhost:8081,測試能否存取SearXNG首頁。
SearXNG的log可由以下指令查看
docker compose logs -f- 日後若要更新SearXNG容器,執行以下指令:
cd ~/searxng
docker compose down
docker compose pull
docker compose up -d2. 建議的settings.yml細部設定#
SearXNG不提供帳號註冊機制,雖然使用者可以在網頁界面修改搜尋設定,但那是透過客戶端cookie保存的。最好在settings.yml事先定義好SearXNG的行為。
SearXNG可以修改settings.yml調整細部設定,定義使用者造訪網頁的預設行為,這樣使用者就不用在網頁修改設定了。
Docker版本的設定檔是存在./core-config/settings.yml。
修改設定請先將容器停止
cd ~/searxng
docker compose down預設啟用的搜尋引擎#
搜尋引擎並非越多越好,會增加SearXNG回應時間到10秒以上。通常我只會保留Google、Duckduckgo、Bing這幾個較多人用的。再來QWant要取消啟用,因為QWant只有在歐洲提供服務,台灣無法使用。
settings.yml裡面有一長串搜尋引擎列表,加上disabled: true的話就會預設在SearXNG搜尋頁面停用:
- name: qwant
qwant_categ: web
engine: qwant
shortcut: qw
categories: [general, web]
disabled: true另外,如果搜尋時候常常中英混合,default_lang的數值設定為all能搜尋到比較多結果。否則預設自動偵測語言的話只會列出中文結果。
autocomplete可以設定在搜尋框打字的時候要使用哪家建議關鍵字。
搜尋結果自動重導向#
將搜尋結果中的網址全部替換為其他網址,比如youtube.com搜尋結果會自動導向到Invidious站台。
- 找到這一段,取消註解啟用Hostname replace插件
enabled_plugins:
- 'Hostname replace'- 找到這一段
hostname_replace,設定重新導向規則。這裡正則表達式都已經寫好了,只要把後面換上要導向的網址就可以了。
hostname_replace:
'(.*\.)?youtube\.com$': 'yewtu.be' # 將Youtube導向Invidious站台
'(.*\.)?youtu\.be$': 'yewtu.be' # 將Youtube導向Invidious站台
'(.*\.)?reddit\.com$': 'libreddit.freedit.eu' # 將Reddit導向LibReddit站台
'(.*\.)?redd\.it$': 'libreddit.freedit.eu' # 將Reddit導向LibReddit站台
'(www\.)?twitter\.com$': 'nitter.net' # 將Twitter導向Nitter站台搜尋結果過濾特定網站#
過濾特定網站,使其不出現在搜尋結果中。比方說封鎖內容農場kknews.cc、read01.com。請參見內容農場列表。
在hostname_replace:這段下方加入要封鎖的網域,同樣使用正則表達式匹配。後面設定false即讓該網站從搜尋結果消失。
# # to remove matching host names from result list, set value to false
'(.*\.)?kknews\.cc$': false
'(.*\.)?read01\.com$': false3. Nginx反向代理範例#
我使用子網域的做法,建立
https://searxng.exmaple.com的子網域來存取SearXNG。SearXNG沒有帳號密碼的機制,網頁界面都是公開的,有需要的話得手動設定Nginx的登入密碼。新增Nginx服務
sudo vim /etc/nginx/sites-available/searxng - 設定以下規則,讓子網域指向Docker容器的通訊埠
server {
server_name https://searxng.exmaple.com; # 子網域
client_max_body_size 0;
location / {
proxy_pass http://127.0.0.1:8080; # Docker通訊埠
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}- 啟用服務
sudo ln -s /etc/nginx/sites-available/searxng /etc/nginx/sites-enabled/
sudo systemctl reload nginx4. 透過網頁調整SearXNG設定#
進入SearXNG首頁後,點選右上角設定做些微調。因為SearXNG沒有帳號密碼,這裡的設定檔是透過cookie保存在客戶端。
注意不是所有設定都能在網頁界面改,最好事先在settings.yml定義好。
搜尋引擎並非越多越好,會增加回應時間。通常我只會保留Google、Duckduckgo、Bing這幾個較多人用的。再來QWant要取消勾選,因為QWant只有在歐洲提供服務,台灣無法使用。
圖片搜尋部份一樣,不用太多來源。
影片的話可把Youtube改為搜尋Invidious結果,並啟用Sepia Search(PeerTube)看到更多影片。
如果要跨裝置存取使用者設定檔,可透過Cookies頁面的網址進行還原。
架在localhost可能導致按存檔之後找不到網址,但其實是有存檔到的。重新打一次https://localhost:8081回首頁就行了。
5. 外網如何存取內網SearXNG站台#
如果沒有使用反向代理的話,使用虛擬區域網路軟體,可讓不同網路的裝置存取自己電腦上的SearXNG服務。
從外部連線存取SearXNG記得要開啟防火牆的8081/tcp通訊埠,並將localhost網址換成區域IP,例如http://172.328.11.7:8081這樣。
6. 將瀏覽器搜尋引擎設為SearXNG#
接著我們要把瀏覽器網址列的預設搜尋引擎設定為SearXNG。
開啟Firefox的設定 → 搜尋引擎新增SearXNG,將其設定為預設搜尋引擎,網址為https://網域/search?q=%s。
手機的話,開啟手機版Firefox,點選設定 → 新增搜尋引擎,網址為https://網域/search?q=%s。


