来自/etc/resolv.conf的Nginxparsing器地址

是否可以在/etc/resolv.conf设置nginx代理configuration中的resolver地址?

例如在docker或virtualenvironment中,它可能很有用。

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

1)从脚本生成parsing器列表并包含它,例如:

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

 http { include resolvers.conf; } 

2)你重新编译nginx与第三方模块(非常)实验perl模块,并写一个variables处理程序:

 http { perl_modules perl/lib; perl_set $resolvers ' sub { return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf"); }; resolver "$resolvers"; } 

现在,如果你是一个C编码器(准备一些血液的眼睛),你仍然可以写一个替代的补丁或模块,使其以这种方式工作。

对于Docker用户,解决scheme在这里find:

下面是使用Docker的人的解决方法。

 export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '` 

这样做是从/etc/resolv.conf获取所有的nameserver条目,并将它们打印在一行中,以便您可以将它们与nginx的resolver指令一起使用。 您的Dockerfile将需要为生成configuration文件的入口点创build一个自定义脚本,然后启动nginx。 比方说,你有一个名为nginx.conf.template的文件,看起来像这样:

 ...snip... http { server { resolver $NAMESERVER valid=10s; ...snip.... } } } 

然后你的启动脚本可以使用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;" 

如果您的系统使用resolvconf(尽可能多的虚拟机所做的,但不幸的是Docker不能,请参阅man 8 resolvconf ),您可以在/etc/resolvconf/update-libc.d/nginx创buildnginx的resolvers.conf (如另一个答案) /etc/resolvconf/update-libc.d/nginx 。 即使在parsing器dynamic变化的情况下也是如此。

 #!/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在默认configuration中包含/etc/nginx/conf.d/*.conf 。 服务未运行时,通常会忽略重新加载。 注意脚本可能在PATH中没有/usr/bin情况下运行,所以你可能需要awk的绝对path。