前言
- 为什么要使用SearXNG
搭建SearXNG需要使用海外的服务器进行搭建,不要使用国内服务器,否则将会导致获取搜索结果超时。
SearXNG可以更好的保护用户的隐私,可以更加准确的搜索到用户所需的内容,类似于以前的DuckDuckGo(现在DuckDuckGo和微软达成了某种协议,可能会和微软共享用户的部分信息,所以SearXNG是目前最佳的选择,由于其搭建在自己的服务器中,而且是完全开源的,所以即使是SearXNG的开发者,也无法获取其他用户的隐私信息,但是强烈建议加上SSL证书,以免信息被监听或盗取)
虽然SearXNG的隐私保护效果比较好,但是仍然建议自己搭建服务器来进行使用,不建议使用公共站点。
由于本人服务器带宽过低,所以不公布SearXNG的实例链接,仅用于自用。
- 如何安装
准备一台服务器(Windows Server 或Linux服务器均可),此处博主以Ubuntu 22.04 服务器为例
可以选择
香港
、日本
、美国
等地的服务器来安装SearXNG国内的服务器请自觉解决网络问题,本博客不为此提供任何技术支持
本文章的所有命令请使用root用户运行
- 参考文献:
安装视频
不要只观看视频,一定要先阅读文章,然后再结合视频进行搭建。
1. 安装前的准备
- Windows用户请点开该网站自行下载
- 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 准备一个域名
- 如果你不打算将服务器建立在国内且网站没有备案的需求,建议在NameSilo、NameCheap、GoDaddy等服务商进行购买域名,否则请前往国内服务商进行注册
- 如果你后期打算在国内建立网站并进行备案,建议前往腾讯云、阿里云、华为云等服务器厂商进行注册
- 例如:本网站的域名
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
[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
sed -i "s|ultrasecretkey|$(openssl rand -hex 32)|g" searxng/settings.yml
如果你的服务器想要托管其他的网站,不建议使用Caddy进行反代
2.3 配置防火墙
如果你使用本地服务器搭建SearXNG或已经关闭防火墙,请忽略该步骤
- 登录你自己的服务器控制台,找到弹性公网IP管理
- 并设置防火墙规则
- 添加规则,设置刚才SearXNG的端口号(如7070),并设置为允许
2.4 启动Docker容器
cd /opt/docker/searxng
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中的内容,无需修改或删除Caddyfile
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,除非你想和其他用户共享你的搜索引擎。
由于uBlacklist插件原生不支持手动添加网站 所以要手动修改源代码以进行适配。
在安装了git的计算机中,可以直接使用以下命令进行部署
git clone https://github.com/iorate/ublacklist
4.3 修改源代码
需要修改/src/common/search-engines.ts
文件
找到 searx
> contentScripts
> matches
项,然后添加以下内容
*://search.example.com/search*
yarn
yarn build-all
例如你使用的是Chrome或Edge浏览器,你应该使用Chrome扩展,如果你使用的是Safari或Firefox,你应该使用对应的浏览器扩展。
博主的Chrome已经安装了扩展,为了不破坏扩展,博主此处使用Edge来进行演示。
- 打开扩展页面,开启开发者模式
- 加载已解压缩的扩展
- 找到对应的目录,例如博主的文件目录为
ublacklist/dist/chrome/production
找到网站点击扩展图标并启用,然后就可以愉快的使用了。
开启后会出现这个界面
修改屏蔽列表,也可以订阅屏蔽列表(详见插件说明)
应用后的效果如下