是否可以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.conf
Openresty 解析器文档):
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/bin
PATH 中的情况下运行,因此您可能需要 awk 的绝对路径。