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

Nik*_*lub 27 nginx

是否可以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)


Fel*_*ikZ 7

对于 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 的这个答案

  • awk,学习它,它是文本处理的绝佳工具:`export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)`。那里不需要 `cat`、`grep` 或 `tr`。 (5认同)