日常使用商业搜索引擎时,最令人头疼的莫过于满屏的广告、无休止的隐私追踪指纹、以及算法推荐的信息茧房。此外,很多开发者在搭建自己的 AI Agent 时,也需要一个没有调用频率上限、无成本的搜索 API 后端。
SearXNG 是目前最成熟的开源元搜索引擎(Meta-Search Engine)。它自己不爬取网页,而是在后台同时向 Google、Bing、Baidu、DuckDuckGo、GitHub、Wikipedia 等数十个引擎并发发起检索,去除所有广告与隐私指纹后,将整合去重的结果呈现给你。
这篇笔记记录如何用 Docker Compose 编排部署 SearXNG 与 Redis 缓存、优化 settings.yml 释放 JSON API、配置 Nginx HTTPS 反代,并将其设为浏览器默认搜索与 AI Agent 搜索后端。
为什么自建 SearXNG 私有聚合搜索
完成本教程后,你将获得以下物理级提升:
- 绝对隐私与零追踪:不记录 IP、不写跟踪 Cookie、不生成搜索画像,向所有上游引擎发起匿名代理查询;
- 多源智能聚合比对:一条搜索词同时向 Google、Bing、GitHub、DuckDuckGo 发送并发查询,去重清洗并按权重综合呈现最优结果;
- 彻底消灭竞价广告:所有商业竞价广告、推广软文与跳转链接在后端清洗层直接被物理抹除;
- 免费 AI Agent 搜索 API:一键开启原生 JSON 接口,无缝接入各类开源 Agent(如 Hermes Agent、Dify、FastGPT、LangChain),告别按次计费的商业搜索 Key。
准备工作
在开始配置前,先明确操作涉及的核心变量。请根据你的服务器域名和实际规划替换对应值:
# ================= 全局参数定义 =================
DOMAIN="search.0000996.xyz" # 访问 SearXNG 的专属公网域名
DATA_DIR="/opt/searxng" # 持久化配置与数据根目录
PORT="8080" # SearXNG 容器绑定的本地回环端口
# ================================================
目录规划与生成安全密钥
SearXNG 依赖一个用于会话加密和 CSRF 防护的 secret_key。如果在启动前没有正确生成并填入 settings.yml,容器会在启动时输出以下错误并直接崩溃退出:
CRITICAL:searx.configuration: secret_key is not set in settings.yml
Error: Exiting due to missing secret_key configuration.
1. 创建规范目录结构
服务器端:
sudo mkdir -p /opt/searxng/searxng
cd /opt/searxng
2. 生成 32 位随机密钥并保存
服务器端:
# 生成高强度随机密钥
openssl rand -hex 32
(例如输出:9f8a3c2b1e4d5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b)
优化 settings.yml 配置文件与解禁 API
SearXNG 的默认配置为了防御爬虫,默认禁用了 JSON 接口,且语言和自动补全并未针对中文环境深度调优。我们需要编写一份兼顾个人日常使用与 AI API 调用的生产级配置文件。
请在 /opt/searxng/searxng/settings.yml 中写入以下配置,记得将 secret_key 替换为你刚才生成的真实随机值:
服务器端:
sudo tee /opt/searxng/searxng/settings.yml << 'EOF'
# --- SearXNG 核心基础设置 ---
use_default_settings: true
general:
debug: false
instance_name: "Private Metasearch"
donation_url: false
contact_url: false
privacypolicy_url: false
enable_metrics: false
# --- Web 前端与主题配置 ---
ui:
static_use_hash: true
default_locale: "zh-CN"
query_in_title: true
infinite_scroll: true # 开启无缝瀑布流翻页
center_alignment: true # 搜索框与结果居中排版 (极客美学)
default_theme: "simple"
theme_args:
simple_style: "dark" # 默认开启护眼暗黑极客主题
search_on_category_select: true
hotkeys: "vim" # 支持 Vim 快捷键导航 (j/k 翻选)
# --- 搜索行为与请求调优 ---
search:
safe_search: 0 # 0: 关闭安全过滤, 1: 中度, 2: 严格
autocomplete: "google" # 搜索词自动补全源 (支持 google, bing, duckduckgo)
ban_time_on_fail: 5
max_ban_time_on_fail: 120
formats:
- html
- json # 核心:必须解禁 json 格式,否则 AI Agent 调用报 403
# --- 生产服务监听与安全密钥 ---
server:
port: 8080
bind_address: "0.0.0.0"
secret_key: "9f8a3c2b1e4d5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b" # 替换为你自己的密钥
base_url: "https://search.0000996.xyz/" # 你的实际公网反代根地址
limiter: false # 私有实例建议关闭限流器,避免 AI Agent 频繁请求被关小黑屋
image_proxy: true # 开启图片代理,防止加载外部图片泄露本地真实 IP
method: "POST" # 优先使用 POST 发送查询,增强私密性
# --- 常用主力引擎权重调优 ---
engines:
- name: google
engine: google
shortcut: g
weight: 2.0
timeout: 3.0
- name: bing
engine: bing
shortcut: b
weight: 1.5
timeout: 3.0
- name: duckduckgo
engine: duckduckgo
shortcut: d
weight: 1.2
timeout: 3.0
- name: github
engine: github
shortcut: gh
weight: 1.0
categories: it
- name: wikidata
engine: wikidata
shortcut: w
weight: 1.0
EOF
用 Docker Compose 编排 SearXNG 与 Redis
SearXNG 官方推荐搭配 Redis 作为热点搜索结果缓存与限流状态存储。通过组合容器,相同的搜索词在 24 小时内直接从本地缓存秒级返回,彻底杜绝上游引擎对服务器 IP 的速率限制。
1. 编写 docker-compose.yml
在 /opt/searxng/docker-compose.yml 中编排服务:
服务器端:
sudo tee /opt/searxng/docker-compose.yml << 'EOF'
version: '3.8'
services:
# --- 本地高速缓存服务 (Redis) ---
redis:
image: redis:alpine
container_name: searxng-redis
restart: always
command: redis-server --save "" --appendonly no # 仅作为瞬态内存缓存,关闭持久化保护硬盘
tmpfs:
- /var/run/redis:rw,noexec,nosuid,size=64m
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "2"
# --- SearXNG 主引擎容器 ---
searxng:
image: searxng/searxng:latest
container_name: searxng
restart: always
depends_on:
- redis
ports:
- "127.0.0.1:8080:8080" # 仅绑定本地回环,安全交由反向代理转发
volumes:
- ./searxng:/etc/searxng:rw
environment:
- SEARXNG_BASE_URL=https://search.0000996.xyz/
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
logging:
driver: "json-file"
options:
max-size: "20m"
max-file: "3"
EOF
2. 点火启动容器
服务器端:
cd /opt/searxng
sudo docker compose up -d
3. 现场核验容器状态
服务器端:
sudo docker compose ps
核验输出:searxng 与 searxng-redis 状态必须显示为 Up,且端口正常绑定。
配置 Nginx 反向代理与 HTTPS 加密
为了实现公网极速访问并隐藏内部端口,配置 Nginx / 1Panel 进行反向代理。注意传递必要的真实 Host 与 Scheme 标头。
1. Nginx 生产反代块配置
服务器端:
server {
listen 80;
server_name search.0000996.xyz;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name search.0000996.xyz;
# SSL 证书配置路径
ssl_certificate /etc/nginx/ssl/search.0000996.xyz.crt;
ssl_certificate_key /etc/nginx/ssl/search.0000996.xyz.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 隐私防泄露:强制不缓存任何搜索请求结果
proxy_buffering off;
proxy_cache off;
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;
# 提高连接与读取超时,防止上游多源聚合慢响应导致 504 Gateway Timeout
proxy_connect_timeout 15s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}
重新加载 Nginx:
sudo nginx -t && sudo systemctl reload nginx
设为浏览器全平台默认搜索引擎
部署完成后,将属于你的私有搜索引擎无缝注入到日常主力浏览器中!
1. 获取 OpenSearch 快速集成
- 使用 Chrome / Edge / Firefox 访问你的域名
https://search.0000996.xyz; - 现代浏览器会自动识别底部的 OpenSearch 规范;
- 在浏览器地址栏输入任意字符并按下 Tab 键,即可直接触发 SearXNG 搜索。
2. 手动设定为默认搜索引擎
进入浏览器 「设置」 ➔ 「搜索引擎」 ➔ 「管理搜索引擎和网站搜索」:
– 搜索引擎名称:SearXNG
– 快捷字词:@s 或 s
– URL 格式(以 %s 代替查询):
text
https://search.0000996.xyz/search?q=%s
– 点击右侧三点菜单,选择 「设为默认搜索引擎」。
作为 AI Agent 的私有无限次搜索后端
在构建企业或个人知识库、AI Agent(如 AutoGPT、LangChain、Hermes Agent 或 Dify)时,最头疼的就是调用商业搜索 API 极其昂贵。
因为我们在 settings.yml 中解禁了 json 格式,现在你的 SearXNG 已经是一个全功能、免鉴权、零成本的搜索 API!
1. 终端命令行物理验证 API
本地电脑:
# 查询 "Linux BBR 加速" 并输出前 3 条结构化 JSON
curl -s "https://search.0000996.xyz/search?q=Linux+BBR+加速&format=json" | jq '.results[0:3][] | {title: .title, url: .url, content: .content}'
验证输出范例:
{
"title": "VPS 开启 BBR 网络加速指南",
"url": "https://blog.0000996.xyz/archives/vps-bbr-guide/",
"content": "详解 Linux 内核原生 BBR 拥塞控制算法部署,彻底解决海外节点网络丢包与吞吐低下..."
}
2. 在 Python / AI Agent 中直接调用
只需简单几行代码,你的 AI 即可实时联网检索最新资讯:
import requests
def private_web_search(query: str, max_results: int = 5):
url = "https://search.0000996.xyz/search"
params = {
"q": query,
"format": "json",
"language": "zh-CN"
}
resp = requests.get(url, params=params, timeout=10)
data = resp.json()
# 提取聚合后的结果
return [
{"title": item.get("title"), "link": item.get("url"), "snippet": item.get("content")}
for item in data.get("results", [])[:max_results]
]
# 实测调用
results = private_web_search("最新开源 AI 智能体框架")
for r in results:
print(f"[{r['title']}] -> {r['link']}")
聚合搜索与 API 输出验证
1. Web 页面与多引擎聚合验证
打开 https://search.0000996.xyz,搜索关键词 Docker:
– 查看结果右侧是否同时标注了 google、bing、duckduckgo 等来源标签;
– 查看页面加载耗时,通常在缓存命中后保持在 200~500ms 极速响应。
2. 隐私阻断验证
按 F12 打开开发者工具网络面板(Network):
– 检查所有返回的静态图片链接,是否通过 /image_proxy?url=... 代理中转;
– 确认没有向任何第三方追踪域名(如 Google Analytics、DoubleClick)发起过额外请求。
常见问题与排障
Q1:为什么调用 JSON API 报 403 Forbidden?
- 根因:
settings.yml中缺少formats: - json,或者limiter: true触发了内部速率风控。 - 排错方案:
1. 检查settings.yml中的search.formats必须包含json;
2. 将server.limiter设为false;
3. 执行sudo docker compose restart searxng重启生效。
Q2:Google 或 Bing 引擎频繁报 Error: CAPTCHA required 或超时?
- 根因:VPS 所在数据中心机房 IP 被 Google 识别为机房爬虫风控。
- 自愈方案:
1. 开启 Redis 缓存:大部分常见词命中本地缓存后不再触发上游风控;
2. 降低特定引擎权重:在settings.yml中临时将 google 的weight调低,提升duckduckgo和bing的权重;
3. 配置上游出站代理:在 compose 中为 searxng 挂载ALL_PROXY=socks5://proxy_ip:port走家宽或优质代理出口。
Q3:修改了 settings.yml,但重启容器配置不生效?
- 避坑要点:检查宿主机与容器的挂载映射路径。宿主机的
./searxng对应容器内的/etc/searxng。修改后必须执行docker compose restart重启进程读取新配置。
还没有人在这篇手记留下纸条,来做第一个亮灯的人吧。