来自 /etc/resolv.conf 的 Nginx 解析器地址

来自 /etc/resolv.conf 的 Nginx 解析器地址

是否可以resolver从 nginx 代理配置中设置地址/etc/resolv.conf

例如,它在docker或虚拟环境中很有用。

答案1

不幸的是,没有简单的方法可以做到这一点,因为 nginx 使用自己的解析器实现。我看到的两个解决方案是:

1)从脚本生成解析器列表并将其包含在内,例如:

echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf

http {

    include resolvers.conf;

}

2)你用第三方模块重新编译 nginx,比如(非常)实验性的perl 模块并编写一个变量处理程序:

http {

    perl_modules perl/lib;
    perl_set $resolvers '

        sub {
            return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
        };

    resolver "$resolvers";
}

现在,如果您是一名出色的 C 程序员(做好流血的准备),您仍然可以编写备用补丁或模块以使其以这种方式工作。

答案2

如果你使用的是 Openresty 版本的 nginx,那么你可以使用它们的特殊local参数来设​​置resolver指令,当设置为 时,意味着解析器将使用local=on的标准路径(有关更多详细信息,请参阅/etc/resolv.confOpenresty 解析器文档):

resolver local=on;

答案3

对于 Kubernetes,您只需添加kube-dns解析器即可。
默认情况下,解析器的 FQDN 基于命名空间kube-system
您可能需要更改 FQDN 以适应您的配置。

location / {
   ...
   resolver kube-dns.kube-system.svc.cluster.local;
   ...
}

您可以在此处阅读有关 DNS 和服务的更多信息https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

答案4

如果您的系统使用 resolvconf (许多虚拟机都使用,但不幸的是 Docker 没有,请参阅man 8 resolvconf),您可以在中创建 nginx resolvers.conf(如另一个答案中所示) /etc/resolvconf/update-libc.d/nginx。即使在解析器动态更改的罕见情况下,这也能很好地发挥作用。

#!/bin/sh
conf="resolver $(/usr/bin/awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf);"
[ "$conf" = "resolver ;" ] && exit 0
confpath=/etc/nginx/conf.d/resolvers.conf
if [ ! -e $confpath ] || [ "$conf" != "$(cat $confpath)" ]
then
    echo "$conf" > $confpath
    service nginx reload >/dev/null
fi
exit 0

一些 Linux 发行版包含/etc/nginx/conf.d/*.conf在其默认配置中。当服务未运行时,通常会忽略重新加载。请注意,脚本可能在不在/usr/binPATH 中的情况下运行,因此您可能需要 awk 的绝对路径。

相关内容