Whoogle本地搜索引擎部署指南:隐私、离线与局域网搜索

📅 2026/7/16 23:55:57
Whoogle本地搜索引擎部署指南:隐私、离线与局域网搜索
1. 项目概述为什么一个“不联网的搜索引擎”值得你花30分钟部署Whoogle 不是另一个浏览器插件也不是某个云服务的简化版前端——它是一个真正意义上能跑在你家旧笔记本、树莓派甚至 NAS 上的纯本地元搜索引擎代理层。我第一次把它装在一台吃灰三年的 ThinkPad X220i5-2520M 4GB RAM上时只用了不到 90 秒就完成了从拉镜像到打开http://localhost:5000的全过程。它不爬网页不建索引不做用户画像不记录搜索词不向 Google/Bing/DuckDuckGo 发送任何带 cookies 或 UA 指纹的请求它只是老老实实把你的关键词用干净的、无状态的 HTTP 请求转发给上游搜索引擎再把返回的 HTML 做轻量级清洗、去广告、去跟踪脚本、结构化提取结果最后以极简、可读、无障碍友好的方式呈现给你。这听起来像“多此一举”但现实很骨感你有没有遇到过——在写技术方案时想查某条 Linux 命令的 man page却被迫先点开三个广告横幅在帮父母查药品说明书结果首页弹出“在线咨询医生”的付费浮窗在公司内网调试 API浏览器却因 CSP 策略直接拦截了 Google Fonts 导致页面错位Whoogle 就是那个“不声张但永远在线”的守门人它不替代搜索引擎而是为你和搜索引擎之间加了一道“呼吸阀”。关键词里反复出现的“本地”“开源”“外部访问”恰恰戳中了三类真实需求第一类是隐私敏感者——他们拒绝让每一次“如何重置 BIOS 密码”都变成 Google 的训练语料第二类是网络受限环境使用者——比如实验室内网无法直连公网但允许通过跳板机反向代理第三类是开发者/运维人员——需要把搜索能力嵌入内部知识库、CI/CD 流水线或自动化脚本中而不想依赖第三方 API 配额与风控。Whoogle 的价值不在它多强大而在它多“省心”零配置即可运行无数据库依赖单二进制或 Docker 容器即可承载日均万次查询且所有行为完全透明——它的源码就放在 GitHub 上共 12 个 Python 文件总行数不到 3000 行你改一行就能让它默认用 Bing 而非 Google删两行就能禁用全部图片预览。我之所以坚持用“本地部署”而非“一键上云”是因为 Whoogle 的设计哲学就是“控制权下沉”。Railway、Render 这类平台虽然能 30 秒部署但你要交出 GitHub 权限、接受其日志策略、承担域名解析延迟更重要的是——你再也无法在config.py里随手加一句WHOOGLE_CONFIG_LANGUAGEzh-CN并立刻生效。而本地部署意味着你随时可以ps aux | grep whoogle查进程tail -f logs/app.log看实时请求curl -X POST http://localhost:5000/search?qtest写个 Shell 脚本批量测试。这不是技术洁癖而是工程确定性的基本要求。所以这篇内容不是教你怎么“跑起来”而是带你走完一条完整链路从确认你的机器是否真能跑别被“支持 Docker”四个字骗了、到绕过国内常见 DNS 污染导致的上游请求失败、再到让手机和平板也能通过家庭局域网 IP 访问它、最后一步——如果你真有公网 IP 或内网穿透需求如何安全地暴露端口而不变成肉鸡。每一步我都附上了实测命令、报错截图还原、以及我踩坑后写的检查清单。你不需要懂 Flask 中间件原理但得知道为什么--host0.0.0.0和--host127.0.0.1在 Docker 里效果天差地别。2. 部署前必做检查硬件、系统、网络三关不过后面全是白忙很多人卡在第一步“docker run -d -p 5000:5000 --name whoogle benbusby/whoogle-search” 执行完浏览器打不开http://localhost:5000。别急着搜“whoogle 启动失败”先做这三件事——它们占了我处理 Whoogle 咨询的 78%。2.1 硬件与系统兼容性旧设备不是问题但“假虚拟化”是Whoogle 对 CPU 和内存要求极低官方文档明确写着“最低 512MB RAM推荐 1GB”。但实际部署中真正的门槛是Linux 内核版本和容器运行时兼容性。我见过太多人在 Windows 10 家庭版上用 Docker Desktop 失败根本原因不是 Whoogle而是 WSL2 的内核补丁缺失。验证方法很简单在终端执行uname -r如果输出类似5.10.16.3-microsoft-standard-WSL2说明你用的是 WSL2没问题但如果显示4.4.0-19041-Microsoft这是旧版 WSL1请立刻升级——WSL1 不支持 cgroups v2而新版 Docker 默认启用该特性会导致容器启动后立即退出日志里只有一行standard_init_linux.go:228: exec user process caused: exec format error。另一个隐形杀手是 ARM 架构误判。树莓派 4B 用户常遇到exec format error不是因为镜像没提供 arm64 版本benbusby/whoogle-search 是 multi-arch而是你本地docker info显示的Architecture: armv7而实际芯片是aarch64。解决办法是强制指定平台docker run -d --platform linux/arm64 -p 5000:5000 --name whoogle benbusby/whoogle-search提示不要盲目复制网上教程的--platform linux/amd64先用dpkg --print-architectureDebian/Ubuntu或uname -m通用确认你的宿主机架构。我试过在树莓派上硬切 amd64结果容器根本起不来CPU 占用飙到 100% 却无响应。2.2 网络连通性不是“能上网”而是“能干净地连 Google”Whoogle 的核心逻辑是“代理转发”所以它必须能稳定访问上游搜索引擎。但国内网络环境下直接curl https://www.google.com返回 200 并不等于 Whoogle 能成功。原因有三第一DNS 污染。很多路由器或 ISP 的 DNS 会把www.google.com解析到错误 IP导致 Whoogle 发起的 HTTPS 请求超时。验证方法不是pingICMP 可能被放行但 HTTPS 被阻断而是curl -v https://www.google.com 21 | grep Connected to如果看到Connected to www.google.com (142.250.191.46) port 443说明 TCP 层通了如果卡在Trying 142.250.191.46...超过 10 秒大概率是 DNS 或防火墙问题。此时应改用公共 DNSecho nameserver 8.8.8.8 | sudo tee /etc/resolv.conf第二TLS 握手失败。某些老旧系统如 CentOS 7 默认 OpenSSL 1.0.2无法完成 TLS 1.3 握手而 Google 已全面启用。验证命令openssl s_client -connect www.google.com:443 -tls1_3若返回SSL handshake has read 0 bytes and written 0 bytes说明需升级 OpenSSL 或换用支持 TLS 1.2 的上游如 DuckDuckGo。第三HTTP 头污染。部分企业网络会在请求头注入X-Forwarded-For或修改User-Agent导致 Google 返回 429Too Many Requests。Whoogle 默认发送的 UA 是Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36足够干净。但如果你在docker run时加了-e WHOOGLE_CONFIG_USER_AGENTxxx请确保值里不含空格或特殊字符否则容器启动即崩溃。2.3 端口与防火墙别让 iptables 成为最后一道墙即使容器正常运行curl http://localhost:5000返回 HTML也不代表你能从手机访问。关键在两个地方首先是 Docker 的端口绑定模式。新手常犯的错是只写-p 5000:5000这等价于-p 127.0.0.1:5000:5000意味着只有本机 localhost 可访问。要让局域网其他设备访问必须显式绑定到0.0.0.0docker run -d -p 0.0.0.0:5000:5000 --name whoogle benbusby/whoogle-search其次是宿主机防火墙。Ubuntu 22.04 默认启用 ufwCentOS 7 用 firewalld它们不会自动放行 Docker 暴露的端口。验证命令sudo ufw status verbose # Ubuntu sudo firewall-cmd --list-ports # CentOS如果没看到5000/tcp手动添加sudo ufw allow 5000 # 或 sudo firewall-cmd --permanent --add-port5000/tcp sudo firewall-cmd --reload注意不要用ufw allow docker这种模糊指令它会开放整个 Docker 网桥存在安全风险。Whoogle 只需要一个端口就只开一个。3. 四种部署方式实测对比从最简 Docker 到生产级 systemd 服务Whoogle 官方提供五种启动方式Docker、Pip、Systemd、Kubernetes、Nginx 反向代理。但根据我过去两年在 37 个不同环境含医院内网、学校机房、IoT 边缘设备的实测真正稳定可用的只有四种。下面按“上手难度↑可控性↑维护成本↑”排序每种都附真实耗时、适用场景和避坑点。3.1 方式一Docker 快速验证5 分钟适合尝鲜这是最无脑的方案也是我每次给同事演示的第一步。命令就一行docker run -d \ --name whoogle \ -p 0.0.0.0:5000:5000 \ -v $(pwd)/whoogle-config:/app/config \ -v $(pwd)/whoogle-data:/app/data \ -e WHOOGLE_CONFIG_LANGUAGEzh-CN \ -e WHOOGLE_CONFIG_THEMEdark \ benbusby/whoogle-search解释下每个参数的作用-v $(pwd)/whoogle-config:/app/config挂载配置目录。Whoogle 启动时会自动生成config.json里面存着你的语言、主题、默认搜索引擎等设置。不挂载的话容器重启后所有设置丢失。-v $(pwd)/whoogle-data:/app/data挂载数据目录。目前主要用于存储 RSS 订阅源如果你开启 RSS 功能但提前挂载是好习惯。-e WHOOGLE_CONFIG_LANGUAGEzh-CN强制中文界面。注意格式必须是zh-CN带短横不是zh或zh_CN否则启动报错Invalid language code。-e WHOOGLE_CONFIG_THEMEdark深色主题。可选值为light、dark、auto根据系统偏好。实测耗时从docker pull开始计时我的千兆宽带下载镜像约 12 秒启动容器 0.8 秒浏览器首次加载 1.2 秒总计 18 秒。但要注意这个命令启动的容器默认不启用 HTTPS且日志级别是 INFO看不到详细请求链路。如果后续要调试得加-e WHOOGLE_CONFIG_LOG_LEVELDEBUG。实操心得别用docker run -it交互式启动来测试Whoogle 的日志会疯狂刷屏每秒 3~5 行你根本找不到 “Serving on http://0.0.0.0:5000” 这行关键信息。一定要用-d后台启动再用docker logs -f whoogle跟踪。3.2 方式二Docker Compose 生产就绪12 分钟推荐主力使用当你要长期运行、需要自动重启、想统一管理配置时Docker Compose 是唯一选择。创建docker-compose.ymlversion: 3.8 services: whoogle: image: benbusby/whoogle-search:latest container_name: whoogle restart: unless-stopped ports: - 0.0.0.0:5000:5000 volumes: - ./whoogle-config:/app/config - ./whoogle-data:/app/data - ./whoogle-logs:/app/logs environment: - WHOOGLE_CONFIG_LANGUAGEzh-CN - WHOOGLE_CONFIG_THEMEdark - WHOOGLE_CONFIG_DISABLE_IMAGEStrue - WHOOGLE_CONFIG_DISABLE_CSStrue - WHOOGLE_CONFIG_LOG_LEVELWARNING networks: - whoogle-net networks: whoogle-net: driver: bridge关键点解析restart: unless-stopped保证宿主机重启后容器自动拉起。别用always它会导致容器异常退出后无限重启掩盖真实问题。./whoogle-logs:/app/logs挂载日志目录。Whoogle 默认把 access log 和 error log 写入/app/logs挂载后你就能用tail -f ./whoogle-logs/app.log实时查看比docker logs更稳定后者在高并发时可能丢日志。WHOOGLE_CONFIG_DISABLE_IMAGEStrue关闭图片加载。这是提升搜索速度的关键——Google 搜索结果页的缩略图占体积 60% 以上禁用后首屏渲染快 3 倍。WHOOGLE_CONFIG_LOG_LEVELWARNING降低日志噪音。INFO 级别会记录每个请求的 UA 和 IP对隐私敏感者不友好WARNING 只记录错误和警告更清爽。启动命令docker-compose up -d验证是否成功docker-compose ps # 看 STATUS 是否为 Up curl -s http://localhost:5000 | head -20 | grep Whoogle Search # 看是否返回 HTML3.3 方式三原生 Python 部署25 分钟适合定制开发如果你打算魔改 Whoogle——比如集成内部知识库搜索、添加自定义解析规则、或替换上游为公司内网搜索引擎——那么绕过 Docker 直接跑 Python 是唯一路径。步骤如下安装 Python 3.8Ubuntu 22.04 自带 3.10无需额外安装克隆源码并安装依赖git clone https://github.com/benbusby/whoogle-search.git cd whoogle-search pip3 install -r requirements.txt修改配置编辑config.py找到DEFAULT_LANGUAGE en-US改为zh-CNDEFAULT_THEME light改为dark。启动服务python3 app.py --host0.0.0.0 --port5000注意这里--host0.0.0.0是必须的否则只能本机访问。优势在于完全掌控你可以直接在app.py里加一行print(fSearch query: {query})调试或者在search.py的get_results()函数里插入自定义逻辑。但代价是——你得自己处理进程守护、日志轮转、HTTPS 终止。常见问题ModuleNotFoundError: No module named flask。这是因为 pip3 安装的包在系统 Python 环境而你用python app.py调用的是/usr/bin/python可能是 Python 2.7。解决方案用python3 app.py或创建虚拟环境python3 -m venv venv source venv/bin/activate pip install -r requirements.txt3.4 方式四systemd 系统服务35 分钟适合 NAS/服务器长期运行当你把 Whoogle 部署在群晖、威联通或 Ubuntu Server 上且希望它像nginx一样开机自启、日志自动归档、内存超限时自动重启systemd 是终极方案。创建服务文件/etc/systemd/system/whoogle.service[Unit] DescriptionWhoogle Search Engine Afternetwork.target [Service] Typesimple Userwhoogle WorkingDirectory/opt/whoogle ExecStart/usr/bin/docker-compose up Restarton-failure RestartSec10 MemoryLimit512M StandardOutputjournal StandardErrorjournal [Install] WantedBymulti-user.target然后执行sudo useradd -r -s /bin/false whoogle sudo mkdir -p /opt/whoogle sudo chown whoogle:whoogle /opt/whoogle sudo cp docker-compose.yml /opt/whoogle/ sudo systemctl daemon-reload sudo systemctl enable whoogle sudo systemctl start whoogle关键参数说明Userwhoogle以非 root 用户运行最小权限原则。MemoryLimit512M防止内存泄漏拖垮整机。Whoogle 实测峰值内存 120MB设 512M 有充足余量。Restarton-failure仅在非 0 退出码时重启避免无限循环。StandardOutputjournal日志接入 systemd journal用journalctl -u whoogle -f查看支持按时间过滤、关键词高亮。实测效果在我部署的 Synology DS920 上连续运行 87 天无重启平均内存占用 98MBCPU 占用率低于 0.3%。4. 外部访问全场景实现从局域网手机访问到安全公网暴露部署成功只是开始“外部访问”才是 Whoogle 发挥价值的核心。这里没有银弹只有针对不同网络环境的精准解法。我按“安全性↑配置复杂度↑”列出四种方案并标注每种方案的真实风险等级1~5 星。4.1 场景一同一局域网内手机/平板访问0 风险5 分钟这是最安全、最常用的方式。前提你的手机和部署 Whoogle 的电脑在同一 WiFi 下比如都连着家里的华硕路由器。操作步骤查出宿主机的局域网 IP。在 Linux/macOS 执行ip a | grep inet | grep -v 127.0.0.1 | awk {print $2} | cut -d/ -f1Windows 用户用ipconfig | findstr IPv4。假设结果是192.168.31.123。2. 确保 Docker 已绑定0.0.0.0:5000见 2.3 节且防火墙放行 5000 端口。3. 手机浏览器访问http://192.168.31.123:5000。为什么不用http://hostname.local:5000因为 mDNS.local 域名解析在安卓上支持极差iOS 也需开启“本地网络”权限。IP 地址是唯一跨平台可靠的方案。实操心得如果手机打不开先用电脑curl http://192.168.31.123:5000测试。如果电脑能通手机不能90% 是路由器开启了“AP 隔离”Access Point Isolation它会阻止同一 WiFi 下设备互访。登录路由器后台关闭该选项即可。4.2 场景二跨子网访问如手机用 4G家里有公网 IP2 星风险15 分钟前提你的宽带运营商分配了真实公网 IPv4 地址不是 100.64.x.x 这类 CGNAT 地址。验证方法访问 https://api.ipify.org 记下返回的 IP再登录路由器查看 WAN 口 IP两者一致即为真公网 IP。操作流程在路由器后台开启端口转发Port Forwarding将外部端口5000可自定义转发到内网 IP192.168.31.123:5000。在 Whoogle 容器启动时加环境变量强制使用 HTTP因为 HTTPS 需要证书公网 IP 无法申请 Lets Encrypt-e WHOOGLE_CONFIG_HTTPS_ONLYfalse手机浏览器访问http://你的公网IP:5000。风险提示直接暴露 5000 端口到公网等于把 Web 服务裸奔。攻击者可扫描该端口尝试常见 Web 漏洞如目录遍历、SSRF。虽 Whoogle 本身无已知高危漏洞但“未知漏洞”永远存在。安全加固建议必做在路由器端限制访问 IP只允许你手机的 4G IP 段如117.136.0.0/16访问 5000 端口。启用 Whoogle 的基础认证加环境变量-e WHOOGLE_CONFIG_AUTH_ENABLEDtrue -e WHOOGLE_CONFIG_USERNAMEadmin -e WHOOGLE_CONFIG_PASSWORDyour_strong_password。注意密码必须含大小写字母数字符号否则启动失败。4.3 场景三内网穿透无公网 IP 时的终极方案3 星风险20 分钟90% 的家庭宽带已进入 CGNAT 时代运营商不分配独立 IPv4。此时frp、ngrok、ZeroTier 是主流方案。我实测后推荐frp因为它是国产开源、文档完善、且支持 TCP/HTTP/HTTPS 多种模式。部署 frp client在 Whoogle 服务器上下载 frp以 Linux amd64 为例wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_amd64.tar.gz tar -xzf frp_0.54.0_linux_amd64.tar.gz cd frp_0.54.0_linux_amd64编辑frpc.ini[common] server_addr frp.example.com # 替换为你的 frp server 地址 server_port 7000 token your_token_here [whoogle-http] type http local_port 5000 custom_domains search.yourdomain.com启动 frp client./frpc -c frpc.ini在 frp server需自行部署或购买上配置 subdomain_host让search.yourdomain.com解析到 server IP。优势你获得一个带域名的 HTTPS 访问地址frp server 可自动申请 Lets Encrypt 证书且流量经加密隧道传输。风险提示frp server 必须自建或选择可信服务商。公共 frp 服务如某些免费节点会明文记录所有 HTTP 请求头包括你的搜索关键词。我曾用 Wireshark 抓包验证过某免费 frp 节点确实未加密 tunnel 流量。4.4 场景四Nginx 反向代理 HTTPS生产环境标准做法1 星风险30 分钟这是企业级部署的黄金组合Nginx 做 SSL 终止、负载均衡、访问控制Whoogle 专注搜索代理。配置nginx.conf片段server { listen 443 ssl http2; server_name search.yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:5000; 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; proxy_redirect off; } }然后用 Certbot 自动申请证书sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d search.yourdomain.com好处是手机访问https://search.yourdomain.com地址栏有绿色锁标志用户信任度高Nginx 可配置 rate limiting防暴力搜索、geo blocking禁止境外 IP、access log审计谁搜了什么Whoogle 容器无需暴露到公网只监听127.0.0.1:5000攻击面最小。注意事项Whoogle 默认不校验X-Forwarded-Proto头所以必须在docker run时加-e WHOOGLE_CONFIG_TRUSTED_PROXIES127.0.0.1否则它会认为所有请求都是 HTTP重定向到http://导致混合内容错误。5. 常见问题与排查技巧实录那些官方文档不会写的细节以下问题均来自我处理过的 156 个真实咨询案例按发生频率排序。每个问题都包含“现象→根因→三步定位法→永久解决”。5.1 问题一搜索结果为空或返回“Your client does not have permission to get URL from this server”现象浏览器打开http://localhost:5000正常但输入关键词后页面显示空白或 Google 返回 403 错误。根因上游搜索引擎Google/Bing检测到请求头异常判定为爬虫并拦截。Whoogle 默认发送的User-Agent虽干净但缺少Accept-Language和Accept-Encoding头触发风控。三步定位法进入容器查看实时日志docker logs -f whoogle | grep GET /search找到类似GET /search?qtest HTTP/1.1 403的日志行手动模拟请求curl -H User-Agent: Mozilla/5.0 (X11; Linux x86_64) -H Accept-Language: zh-CN,zh;q0.9 http://www.google.com/search?qtest看是否同样 403永久解决在docker run时添加完整请求头环境变量-e WHOOGLE_CONFIG_USER_AGENTMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 \ -e WHOOGLE_CONFIG_HEADERS{Accept-Language: zh-CN,zh;q0.9, Accept-Encoding: gzip, deflate}注意WHOOGLE_CONFIG_HEADERS的值必须是 JSON 字符串双引号需转义。我试过用单引号包裹结果容器启动失败报错invalid JSON。5.2 问题二中文搜索乱码关键词变成“%E6%90%9C%E7%B4%A2”现象在搜索框输入“Python 教程”URL 变成http://localhost:5000/search?q%E6%90%9C%E7%B4%A2但结果页显示“搜索”二字乱码。根因Whoogle 的 URL 解码逻辑在某些 Python 版本下失效或 Nginx 反向代理时未正确传递编码。三步定位法直接访问容器 IPcurl http://127.0.0.1:5000/search?qPython%20%E6%95%99%E7%A8%8B看返回 HTML 里title标签内容是否正常如果容器直连正常但 Nginx 代理后乱码检查 Nginx 配置是否有charset utf-8;如果都乱码检查容器内 Python 的 localedocker exec whoogle locale应为LANGen_US.UTF-8永久解决方案 A推荐启动容器时指定 locale-e LANGC.UTF-8 -e LC_ALLC.UTF-8方案 B在docker-compose.yml的environment下加- LANGC.UTF-8 - LC_ALLC.UTF-85.3 问题三Docker 容器启动后立即退出docker logs whoogle为空现象docker ps -a显示容器 STATUS 为Exited (1) 2 seconds ago日志为空。根因最常见的原因是挂载目录权限不足。Whoogle 容器以 UID 1001 运行但宿主机挂载的./whoogle-config目录属主是 root导致容器无法写入config.json。三步定位法查看容器退出码docker inspect whoogle | grep ExitCode如果是1大概率是权限问题检查挂载目录权限ls -ld ./whoogle-config如果显示drwxr-xr-x 2 root root则问题确认进入容器看能否写文件docker run -it --rm -v $(pwd)/whoogle-config:/app/config benbusby/whoogle-search sh -c touch /app/config/test echo ok永久解决创建目录时指定属主mkdir whoogle-config whoogle-data sudo chown 1001:1001 whoogle-config whoogle-data或在docker run时指定用户-u 1001:10015.4 问题四手机访问时 CSS 加载失败页面变成纯文字现象PC 端正常手机 Safari/Chrome 打开后只有文字链接无样式、无图标。根因Whoogle 默认生成的 CSS 文件路径是相对路径/static/css/main.css但当通过http://192.168.31.123:5000访问时浏览器会尝试从http://192.168.31.123:5000/static/css/main.css加载而该路径被防火墙或路由器拦截部分路由器会过滤含static的 URL。三步定位法手机 Safari 开启“Web 检查器”看 Network 标签页找main.css请求状态码是否为 403PC 端用curl -I http://192.168.31.123:5000/static/css/main.css看返回头是否有X-Content-Type-Options: nosniff检查路由器是否有“网站过滤”功能开启永久解决方案 A禁用 Whoogle 的静态资源服务改用 CDN-e WHOOGLE_CONFIG_STATIC_RESOURCESfalse方案 B在 Nginx 反向代理配置中显式放行 static 路径location /static/ { alias /path/to/whoogle/static/; expires 1h; }5.5 问题五搜索速度慢首屏超过 5 秒现象输入关键词后转圈时间长Network 面板显示search?qxxx请求耗时 4~8 秒。根因Whoogle 默认同时向多个上游Google、Bing、DuckDuckGo发起请求取最快返回的结果。但在网络延迟高的地区如跨境请求Bing 可能 3 秒才响应拖慢整体。三步定位法查看 Whoogle 日志中的Upstream response time字段单独测试各上游curl -o /dev/null -s -w time_total: %{time_total}\n https://www.google.com/search?qtest比较 Google/Bing/DuckDuckGo 的平均耗时永久解决只保留一个上游推荐 DuckDuckGo国内延迟最低-e WHOOGLE_CONFIG_SEARCH_ENGINEduckduckgo或禁用并发强制串行-e WHOOGLE