搭建极简版 SearXNG,打造免费、无限额度的聚合搜索 API (去 Redis/纯 JSON 版)

意外富翁 · 1个月前 · 技术 · 55 · 0

对于独立开发者来说,想要在自己的应用(比如 AI 助手、内容聚合站)里加入“联网搜索”功能,一直是个痛点:

  • Google Custom Search API: 每天免费 100 次,超过后价格昂贵。
  • Bing Search API: 申请门槛高,且免费额度不仅少还限制并发。
  • 直接爬虫: 容易被封 IP,需要维护复杂的代理池。

SearXNG 是一个非常棒的开源元搜索引擎,它可以聚合 Google, Bing, DuckDuckGo 等几十个引擎的结果。但官方推荐的部署方式比较“重”,通常需要 Redis 来做缓存和限流,还要跑一个 Web 界面,对于小配置 VPS(比如 1核 512M/1G)来说负担略重。

本文将记录如何将 SearXNG 裁剪到极致移除 Redis、移除 UI 渲染、只保留 JSON 接口,把它变成一个纯粹的、轻量级的私有搜索微服务。


准备工作

  • 一台 VPS(任意配置,只要能跑 Docker 即可)。
  • 已安装 Docker 和 Docker Compose。

第一步:规划目录结构

为了保持清爽,我们在服务器上创建一个独立的目录:

mkdir -p my-searxng/searxng
cd my-searxng
touch docker-compose.yml
touch searxng/settings.yml

现在的结构应该是这样的:

my-searxng/
├── docker-compose.yml   # 容器编排
└── searxng/
    └── settings.yml     # 核心配置(挂载进容器)

第二步:编写 docker-compose.yml

通常 SearXNG 需要配合 Redis 容器运行,但既然我们是自用 API,可以通过配置关掉限流功能,从而彻底抛弃 Redis

编辑 docker-compose.yml

version: '3'

services:
  searxng:
    image: searxng/searxng:latest
    container_name: searxng-api
    restart: always
    ports:
      - "8080:8080"
    volumes:
      # 【关键】挂载本地配置文件覆盖容器默认配置
      - ./searxng:/etc/searxng:rw
    environment:
      - SEARXNG_BASE_URL=http://localhost:8080/
    # 必要的安全与权限配置
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
    # 限制日志大小,防止塞满硬盘
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "1"

第三步:配置 settings.yml (核心魔改)

这是最关键的一步。我们需要在配置中显式关闭所有依赖 Redis 的功能(Limiter 和 Image Proxy),并强制开启 JSON 输出。

编辑 searxng/settings.yml

# 继承默认配置
use_default_settings: true

general:
  debug: false
  instance_name: "My Private Search API"

search:
  safe_search: 0           # 0=None, 1=Moderate, 2=Strict
  autocomplete: ""         # API 不需要自动补全
  formats:
    - json                 # 显式开启 JSON 格式支持

server:
  port: 8080
  bind_address: "0.0.0.0"
  secret_key: "ChangeMeToSomethingRandom" # 必须修改,随意填字符串
  
  # 【魔改核心 1】关闭限流器 (因为我们移除了 Redis)
  limiter: false 
  
  # 【魔改核心 2】关闭图片代理 (API 只需要 URL,不需要服务器代下载图片)
  image_proxy: false
  
  default_http_headers:
    X-Content-Type-Options: nosniff

# 【魔改核心 3】显式禁用 Redis 连接
redis:
  url: false

# UI 设置 (虽然我们只用 API,但为了防报错保留基础配置)
ui:
  static_use_hash: true

第四步:解决权限坑 (The Gotcha)

SearXNG 容器内部使用 searxng 用户(UID 977)运行。如果不修改挂载目录的权限,容器启动时会因无法读取 settings.yml 而崩溃。

my-searxng 目录下执行:

# 暴力解法 (简单粗暴)
sudo chmod -R 777 ./searxng

# 或者 优雅解法 (推荐)
# sudo chown -R 977:977 ./searxng

第五步:启动与测试

一切就绪,启动容器:

docker compose up -d

查看日志确认启动成功:

docker logs -f searxng-api

如果你看到 "Listening on 0.0.0.0:8080" 且没有 Redis 报错,恭喜你,成功了!

API 调用测试

现在,你可以通过简单的 HTTP 请求来搜索了。

请求 URL 格式:
http://你的服务器IP:8080/search?q={关键词}&format=json

示例:
在浏览器访问 http://1.2.3.4:8080/search?q=Python教程&format=json

你将获得一段标准的 JSON 数据,包含标题、链接、摘要等信息,非常适合直接喂给 LLM (ChatGPT/Gemini) 做 RAG(检索增强生成)。


进阶:Python 调用示例

既然搭建好了,我们写一段 Python 代码来封装这个搜索服务:

import requests

def search_web(query, engines="google,duckduckgo"):
    url = "http://localhost:8080/search"
    params = {
        "q": query,
        "format": "json",
        "engines": engines, # 指定使用哪些引擎
        "language": "zh-CN"
    }
    
    try:
        response = requests.get(url, params=params)
        data = response.json()
        
        results = []
        if "results" in data:
            for item in data["results"][:5]: # 取前5条
                results.append({
                    "title": item.get("title"),
                    "link": item.get("url"),
                    "snippet": item.get("content")
                })
        return results
    except Exception as e:
        print(f"搜索出错: {e}")
        return []

# 测试
res = search_web("2025年高分科幻电影")
for r in res:
    print(f"[{r['title']}] - {r['link']}")

总结与注意事项

通过移除 Redis 和 UI 组件,我们得到了一个极度轻量的搜索微服务。

注意事项:

  1. 没有限流保护: 因为去掉了 Redis,如果你的代码写了死循环疯狂请求接口,Google 会封锁你 VPS 的 IP。请务必在你的客户端代码(Python/Go)里通过 sleep 自行控制频率。
  2. 引擎选择: 如果 Google 经常跳验证码,可以在请求参数里指定 engines=bing,duckduckgo 来避开。
  3. 私有化: 建议不要将 8080 端口直接暴露给公网,或者配合 Nginx 加一个密码验证,防止被他人滥用。

这个方案非常适合用于个人开发者的 AI 选片助手新闻聚合器自动化监控脚本。希望能帮到大家!

已复制到剪贴板

评论 0 条

暂无评论,来种下第一颗种子。