Nginx 偶尔无法解析 proxy_pass 的主机名

Nginx 偶尔无法解析 proxy_pass 的主机名

我的 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 域的请求。

相关内容