回答:
残念ながら、nginxは独自のリゾルバー実装を使用するため、これを行う簡単な方法はありません。私が見る2つの解決策は次のとおりです。
1)スクリプトからリゾルバーリストを生成し、それを含めます。例:
echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf
http {
include resolvers.conf;
}
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";
}
さて、あなたがCコーダーの地獄であるなら(いくらかの血のためにあなたの目を準備してください)、あなたはそれがまだこのように働くようにする代替のパッチまたはモジュールを書くことができます。
Dockerユーザーの場合、解決策は次のとおりです。
Dockerを使用しているユーザー向けの回避策です。
export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`
これにより、すべての
nameserver
エントリ が取得さ/etc/resolv.conf
れ、1行で出力されるため、nginxのresolver
ディレクティブで使用できます。Dockerfileには、構成ファイルを生成してから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;"
dockerでは、デフォルトでdocker組み込みDNSサーバーがそうであるように127.0.0.11
、これは同じファイルになる傾向があることに注意してください。DockerNetwork Nginx Resolverへのこの回答を参照してください。
システムが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への絶対パスが必要になる場合があります。
nginxのOpenrestyバージョンを使用している場合、に設定すると、リゾルバーによって標準パスが使用されることを意味するディレクティブに特別なlocal
引数を使用できます(詳細については、Openrestyリゾルバーのドキュメントを参照してください)。resolver
local=on
/etc/resolv.conf
resolver local=on;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)
。cat
、grep
またはその必要はありませんtr
。