是否可以在/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。