我的 nginx 反向代理设置存在问题:大约 5% 的请求会出现 502 错误,error.log 中会有相应的条目显示:
[error] 12314#12314: *749929 searxng.docker could not be resolved (3: Host not found), client: *redacted*, server: search.*redacted*, request: "GET / HTTP/2.0", host: "search.*redacted*"
因此,根据此信息,底层 SearXNG docker 容器的 DNS 解析失败。我在同一台机器上有一个 DNS 服务器,它将 *.docker 域映射到本地 docker 容器,并且在nslookup searxng.docker
每个请求之前和之后运行它总是返回正确的结果(例如 172.17.0.3)。其他 ~95% 的 nginx 请求也正常工作,因此 DNS 解析似乎没问题。
这是服务器配置(包括内联):
server {
listen 443 ssl;
listen [::]:443 ssl;
resolver 127.0.0.1 8.8.8.8;
set $backend "http://searxng.docker:8080";
server_name search.*redacted* ;
ssl_certificate *redacted*.pem;
ssl_certificate_key *redacted*.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_dhparam *redacted*.pem;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
location / {
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_intercept_errors off;
proxy_http_version 1.1;
proxy_set_header Host $http_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_pass $backend;
}
}
并且 /etc/resolv.conf
nameserver 127.0.0.1
nameserver 8.8.8.8
domain *redacted*
同一代理还为其他配置几乎相同的网站提供服务,它们都存在这个问题,所以我认为这不是 SearXNG 独有的问题。我还尝试了一些 DNS 服务器设置。该设备是 Synology NAS,所以我首先使用了它们的 DNS 服务器应用程序(docker 域的主区域,容器的 A 记录)。我还尝试了 dnsmasq(默认配置)和 CoreDNS(见下文),两者都从 hosts 文件提供服务,以及从 10 秒到 1 天的不同 TTL 值。解析 *.docker 主机名对它们都有效,但 nginx 对它们也存在同样的问题。
CoreDNS 配置(我尝试了 TTL 为 10、60、3600 和 86400):
. {
hosts {
ttl 60
}
}
尽管 DNS 解析似乎工作正常,但知道什么可能导致 nginx 似乎无法随机解析主机名吗?
答案1
我认为我找到了问题所在:从 nginx 配置中删除第二个 DNS 解析器似乎可以解决问题。根据文档,nginx 不会逐一查找主机名(如我所想),而是使用 RR 选择一个。这意味着 50% 的时间它会选择 Google 的公共 DNS 服务器,当然它无法响应对 *.docker 域的请求。