是否可以resolver
在 nginx 代理配置中设置地址/etc/resolv.conf
?
例如,它在 docker 或虚拟环境中很有用。
Xav*_*cas 17
不幸的是,没有简单的方法可以做到这一点,因为 nginx 使用它自己的解析器实现。我看到的两个解决方案是:
1)您从脚本生成解析器列表并将其包含在内,例如:
echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf
http {
include resolvers.conf;
}
Run Code Online (Sandbox Code Playgroud)
2)您使用第三方模块(如(非常)实验性的perl 模块)重新编译 nginx并编写一个变量处理程序:
http {
perl_modules perl/lib;
perl_set $resolvers '
sub {
return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
};
resolver "$resolvers";
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你是一个 C 编码器(准备好你的眼睛),你仍然可以编写一个替代补丁或模块来让它以这种方式工作。
小智 12
kube-dns
对于 Kubernetes,您只需添加为解析器即可。
默认情况下,解析器的 FQDN 基于命名空间kube-system
。
您可能必须更改 FQDN 以适应您的配置。
location / {
...
resolver kube-dns.kube-system.svc.cluster.local;
...
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读有关 DNS 和服务的更多信息https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
Pie*_*erz 11
如果您使用的是 nginx 的 Openresty 版本,那么您可以将它们的特殊local
参数用于resolver
指令,当设置为 时local=on
,意味着/etc/resolv.conf
解析器将使用的标准路径(有关更多详细信息,请参阅Openresty 解析器文档):
resolver local=on;
Run Code Online (Sandbox Code Playgroud)
对于 Docker 用户,可以在此处找到解决方案:
这是使用 Docker 的人的解决方法。
export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`
Run Code Online (Sandbox Code Playgroud)
它的作用是获取所有
nameserver
条目/etc/resolv.conf
并将它们打印在一行中,因此您可以将它们与 nginx 的resolver
指令一起使用。您的 Dockerfile 将需要一个用于生成配置文件然后启动 nginx 的入口点的自定义脚本。假设您有一个名为的文件nginx.conf.template
,它看起来像:
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后您的启动脚本可以使用该
envsubst
程序生成一个nginx.conf
然后启动 nginx。例如:
#!/bin/bash
if [ "$NAMESERVER" == "" ]; then
export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`
fi
echo "Nameserver is: $NAMESERVER"
echo "Copying nginx config"
envsubst '$NAMESERVER' < /nginx.conf.template > /nginx.conf
echo "Using nginx config:"
cat /nginx.conf
echo "Starting nginx"
nginx -c /nginx.conf -g "daemon off;"
Run Code Online (Sandbox Code Playgroud)
请注意,在 docker 中这往往会产生相同的文件,因为默认情况下 docker 嵌入式 DNS 服务器是127.0.0.11
,请参阅Docker Network Nginx Resolver 的这个答案。
归档时间: |
|
查看次数: |
24123 次 |
最近记录: |