前言

  • 为什么要使用SearXNG

搭建SearXNG需要使用海外的服务器进行搭建,不要使用国内服务器,否则将会导致获取搜索结果超时。

SearXNG可以更好的保护用户的隐私,可以更加准确的搜索到用户所需的内容,类似于以前的DuckDuckGo(现在DuckDuckGo和微软达成了某种协议,可能会和微软共享用户的部分信息,所以SearXNG是目前最佳的选择,由于其搭建在自己的服务器中,而且是完全开源的,所以即使是SearXNG的开发者,也无法获取其他用户的隐私信息,但是强烈建议加上SSL证书,以免信息被监听或盗取)

虽然SearXNG的隐私保护效果比较好,但是仍然建议自己搭建服务器来进行使用,不建议使用公共站点。

由于本人服务器带宽过低,所以不公布SearXNG的实例链接,仅用于自用。

  • 如何安装

准备一台服务器(Windows Server 或Linux服务器均可),此处博主以Ubuntu 22.04 服务器为例

注意

尽量不要选择国内的服务器,由于大陆的GFW封锁,会让SearXNG的搜索显示不全甚至是无法使用SearXNG 可以选择香港日本美国等地的服务器来安装SearXNG 国内的服务器请自觉解决网络问题,本博客不为此提供任何技术支持 本文章的所有命令请使用root用户运行

  • 参考文献:

  1. 我不是咕咕鸽的文章 SearXNG安装

  2. 我不是咕咕鸽的文章 Nginx Proxy Manger反代

  3. SearXNG官方文档(英文)

安装视频

不要只观看视频,一定要先阅读文章,然后再结合视频进行搭建。

[bilibili bvid=BV19v4y1h72U]

点此一键三连

1. 安装前的准备

  • Windows用户请点开该网站自行下载

https://www.docker.com/

  • Linux用户请根据下方教程自行安装,Arch Linux用户可以使用pacman直接安装

1.1 安装Docker

从远程服务器下载并安装Docker

wget -qO- get.docker.com | bash

查看版本号

docker -v

启动docker服务

systemctl enable --now docker

1.2 安装Docker Compose

从远程服务器拉取Docker Compose

curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

赋予可执行权限

chmod +x /usr/local/bin/docker-compose

查看版本

docker-compose --version

1.3 Arch Linux安装Docker和Docker Compose

升级系统

pacman -Syu

安装Docker和Docker Compose

pacman -S docker docker-compose

查看docker版本号

docker -v

查看docker compose版本号

docker-compose --version

1.4 准备一个域名

  • 如果你不打算将服务器建立在国内且网站没有备案的需求,建议在NameSiloNameCheapGoDaddy等服务商进行购买域名,否则请前往国内服务商进行注册

  • 如果你后期打算在国内建立网站并进行备案,建议前往腾讯云、阿里云、华为云等服务器厂商进行注册

  • 例如:本网站的域名senge.dev就是在GoDaddy注册的,后期迁移到了NameSilo

2. 开始安装SearXNG

2.1 拉取Docker项目

创建安装目录

mkdir -p /opt/docker/searxng

克隆docker项目

git clone https://github.com/searxng/searxng-docker.git /opt/docker/searxng

2.2 配置文件修改

使用文本编辑器编辑docker-compose.yaml文件,自行修改端口号

version: '3.7'
​
services:
######   如果你不想使用caddy进行反代或者是你在本地搭建,请注释掉下方的内容   ######
    caddy:
        container_name: caddy
        image: caddy:2-alpine
        network_mode: host
        volumes:
            - ./Caddyfile:/etc/caddy/Caddyfile:ro
            - caddy-data:/data:rw
            - caddy-config:/config:rw
        environment:
            - SEARXNG_HOSTNAME=${SEARXNG_HOSTNAME:-http://localhost:80}
            - SEARXNG_TLS=${LETSENCRYPT_EMAIL:-internal}
        cap_drop:
            - ALL
        cap_add:
            - NET_BIND_SERVICE
            - DAC_OVERRIDE
######   如果你不想使用caddy进行反代或者是你在本地搭建,请注释掉上方的内容   ######
​
    redis:
        container_name: redis
        image: redis:alpine
        command: redis-server --save  --appendonly no
        networks:
            - searxng
        tmpfs:
            - /var/lib/redis
        cap_drop:
            - ALL
        cap_add:
              - SETGID
              - SETUID
              - DAC_OVERRIDE
​
    searxng:
        container_name: searxng
        image: searxng/searxng:latest
        networks:
            - searxng
        ports:
            - 7070:8080   # 原代码为127.0.0.1:8080:8080,需要去除前面的127.0.0.1或者是将前面的127.0.0.1改为0.0.0.0,否则SearXNG只允许本地访问而无法外网访问
        volumes:
            - ./searxng:/etc/searxng:rw
        environment:
            - SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/
        cap_drop:
            - ALL
        cap_add:
            - CHOWN
            - SETGID
            - SETUID
            - DAC_OVERRIDE
        logging:
            driver: json-file
            options:
        max-size: 1m
        max-file: 1
networks:
    searxng:
        ipam:
            driver: default

使用文本编辑器编辑.env文件,反注释井号前面的内容并自行修改域名和Let’s Encrypt邮箱(就像这样),如果你不想使用Caddy配置反向代理,第二行无需反注释

SEARXNG_HOSTNAME=search.example.com<br></br>[email protected]

如果使用Caddy进行反向代理,需要将Caddyfile中的端口号8080改成你自己的端口号(如果端口号没修改则无需修改Caddyfile)

{
  admin off
}

{$SEARXNG_HOSTNAME} {
  log {
        output discard
  }

  tls {$SEARXNG_TLS}

  @api {
        path /config
        path /healthz
        path /stats/errors
        path /stats/checker
  }

  @static {
        path /static/*
  }

  @notstatic {
        not path /static/*
  }

  @imageproxy {
        path /image_proxy
  }

  @notimageproxy {
        not path /image_proxy
  }

  header {
        # Enable HTTP Strict Transport Security (HSTS) to force clients to always connect via HTTPS
        Strict-Transport-Security max-age=31536000; includeSubDomains; preload

        # Enable cross-site filter (XSS) and tell browser to block detected attacks
        X-XSS-Protection 1; mode=block

        # Prevent some browsers from MIME-sniffing a response away from the declared Content-Type
        X-Content-Type-Options nosniff

        # Disable some features
        Permissions-Policy accelerometer=(),ambient-light-sensor=(),autoplay=(),camera=(),encrypted-media=(),focus-without-user-activation=(),geolocation=(),gyroscope=(),magnetometer=(),microphone=(),midi=(),payment=(),picture-in-picture=(),speaker=(),sync-xhr=(),usb=(),vr=()

        # Disable some features (legacy)
        Feature-Policy accelerometer 'none';ambient-light-sensor 'none'; autoplay 'none';camera 'none';encrypted-media 'none';focus-without-user-activation 'none'; geolocation 'none';gyroscope 'none';magnetometer 'none';microphone 'none';midi 'none';payment 'none';picture-in-picture 'none'; speaker 'none';sync-xhr 'none';usb 'none';vr 'none'

        # Referer
        Referrer-Policy no-referrer

        # X-Robots-Tag
        X-Robots-Tag noindex, noarchive, nofollow

        # Remove Server header
        -Server
  }

  header @api {
        Access-Control-Allow-Methods GET, OPTIONS
        Access-Control-Allow-Origin  *
  }

  # Cache
  header @static {
        # Cache
        Cache-Control public, max-age=31536000
        defer
  }

  header @notstatic {
        # No Cache
        Cache-Control no-cache, no-store
        Pragma no-cache
  }

  # CSP (see http://content-security-policy.com/ )
  header @imageproxy {
        Content-Security-Policy default-src 'none'; img-src 'self' data:
  }

  header @notimageproxy {
        Content-Security-Policy upgrade-insecure-requests; default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; form-action 'self' https://github.com/searxng/searxng/issues/new; font-src 'self'; frame-ancestors 'self'; base-uri 'self'; connect-src 'self' https://overpass-api.de; img-src 'self' data: https://*.tile.openstreetmap.org; frame-src https://www.youtube-nocookie.com https://player.vimeo.com https://www.dailymotion.com https://www.deezer.com https://www.mixcloud.com https://w.soundcloud.com https://embed.spotify.com
  }

  # SearXNG
  handle {
        encode zstd gzip

        reverse_proxy localhost:7070 {

               # 在上方修改端口号,此处以7070为例,需要改成自己的端口号
               header_up X-Forwarded-Port {http.request.port}
               header_up X-Forwarded-Proto {http.request.scheme}
        }
  }

}

使用openssl生成密钥

cd /opt/docker/searxng<br></br>sed -i s|ultrasecretkey|$(openssl rand -hex 32)|g searxng/settings.yml

注意

使用Caddy反代将导致其他Docker镜像的80端口被占用 如果你的服务器想要托管其他的网站,不建议使用Caddy进行反代

2.3 配置防火墙

如果你使用本地服务器搭建SearXNG或已经关闭防火墙,请忽略该步骤

  1. 登录你自己的服务器控制台,找到弹性公网IP管理

  2. 并设置防火墙规则

  3. 添加规则,设置刚才SearXNG的端口号(如7070),并设置为允许

2.4 启动Docker容器

cd /opt/docker/searxng<br></br>docker-compose up -d

注意

  • Lets Encrypt申请SSL需要一定时间,在搭建好后的5~10分钟再进行访问

  • 确保域名真实可访问,否则可能会申请失败

2.5 访问SearXNG

直接通过ip+端口号访问,如:114.51.41.91:9810访问(随便输的IP,换成自己的即可),如果你绑定了域名,那么可以直接通过域名访问,如:search.example.com

3 不通过caddy实现反向代理

Caddy反代是一种比较方便的方式,但是有一些弊端,不过现在也有其他的方法可以进行反代

下方两种反代方式均需要注释掉Caddy中的内容

3.1 Nginx Proxy Manager反代

检查端口号是否被占用

# 检查80端口是否被占用
lsof -i:80
# 检查81端口是否被占用
lsof -i:81
# 检查443端口是否被占用
lsof -i:443

新建目录用于安装Nginx Proxy Manager

mkdir -p /opt/docker/nginx-proxy-manager
cd /opt/docker/nginx-proxy-manager

新建docker-compose.yaml文件并使用默认编辑器进行编辑

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'    # 重要,不允许被占用,如果80被占用请解除占用
      - '81:81'    # 如果81被占用请选择其他端口号,不允许和SearXNG端口号相同
      - '443:443'  # 重要,不允许被占用,如果443被占用请解除占用
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

使用命令进行安装Nginx Proxy Manager

docker-compose up -d

通过ip:81端口进行访问,如:114.51.41.99:81(改成你自己的端口号)

使用默认账号密码进行登录,首次登陆会提示你修改密码。

账号:[email protected]
密码:changeme

3.2 宝塔面板Nginx反代

由于博主已经放弃使用宝塔面板,宝塔Nginx反代相关可以参考下方的文章

Nginx反向代理配置方法 - Linux面板 - 宝塔面板论坛 (bt.cn)

4. 屏蔽CSDN等网站

4.1 概述

博主打算分享自己通过修改配置文件来屏蔽CSDN等网站,但是在官方文档中未找到屏蔽CSDN的方法,所以这里博主使用插件的方式屏蔽CSDN等网站,缺点是手机等移动端使用仍然无法屏蔽,除非使用带插件的浏览器(支持的浏览器此处不再赘述)。

4.2 下载插件源代码

构建插件要在实体机上构建,如果你的实体机无法连接GitHub,你也可以通过服务器进行下载插件并进行构建,构建完成后你要将其打包并复制到实体机中。

在你搭建好以后,你需要克隆uBlacklist源代码,然后进行修改,插件作者为iorate,必须使用插件,不要从Chrome应用商店下载,尽量不要提交Pull Request,除非你想和其他用户共享你的搜索引擎。

iorate/ublacklist

由于uBlacklist插件原生不支持手动添加网站 所以要手动修改源代码以进行适配。

在安装了git的计算机中,可以直接使用以下命令进行部署

git clone https://github.com/iorate/ublacklist

4.3 修改源代码

需要修改/src/common/search-engines.ts文件

找到 searx > contentScripts > matches 项,然后添加以下内容

*://search.example.com/search*

安装nodejsyarn,重新构建ublacklist

yarn

yarn build-all

例如你使用的是Chrome或Edge浏览器,你应该使用Chrome扩展,如果你使用的是Safari或Firefox,你应该使用对应的浏览器扩展。

博主的Chrome已经安装了扩展,为了不破坏扩展,博主此处使用Edge来进行演示。

  • 打开扩展页面,开启开发者模式

打开开发人员模式(Chrome下为开发者模式)- 加载已解压缩的扩展

加载已解压的扩展- 找到对应的目录,例如博主的文件目录为ublacklist/dist/chrome/production