/etc/resolv.confからのNginxリゾルバーアドレス


18

resolverからnginxプロキシ設定でアドレスを設定することは可能/etc/resolv.confですか?

たとえば、Dockerや仮想環境で役立ちます。

回答:


16

残念ながら、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コーダーの地獄であるなら(いくらかの血のためにあなたの目を準備してください)、あなたはそれがまだこのように働くようにする代替のパッチまたはモジュールを書くことができます。


6

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.confnginxを起動できます。例えば:

#!/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へのこの回答を参照してください。


2
Awk、それを学んでください、それはテキスト変更のための素晴らしいツールです:export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)catgrepまたはその必要はありませんtr
j0057

ただし、これはKubernetesでは機能しません。
キム

1

システムが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/binPATHで指定せずに実行される場合があるため、awkへの絶対パスが必要になる場合があります。


1

nginxのOpenrestyバージョンを使用している場合、に設定すると、リゾルバーによって標準パスが使用されることを意味するディレクティブに特別なlocal引数を使用できます(詳細については、Openrestyリゾルバーのドキュメントを参照してください)。resolverlocal=on/etc/resolv.conf

resolver local=on;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.