問題の説明

Dockerコンテナ内でNginxをリバースプロキシとして使用する場合、あるサービスを先に起動してから別のサービスのイメージを構築する必要がある場合があります。Nginxの設定ファイルでproxy_pass直接、まだ起動していないサービスを指すように設定すると、 Nginxは起動に失敗し、「Host Not Found」例外が発生します。 例外が見つかりました。

以下は基本的なnginxの設定例です。

server {
    listen 80;
    server_name prds98.com;
    location / {
        proxy_pass http://some-service:port;
    }
}

この設定では、 some-serviceサービスが実行されていない場合、 Nginx は起動に失敗します。

以下は調整後のnginx設定ファイルです。

server {
    resolver 127.0.0.11 valid=30s ipv6=off;
    listen 80;
    server_name prds98.com;
    location / {
        set $something http://some-service:port
        proxy_pass $something;
    }
}

ステップ1:リゾルバの設定

127.0.0.11 はDocker の内部 DNS サービスで、サービス名を IPv4 アドレスに解決します。この DNS は変更されないため、ハードコーディングしても問題ありません。 キャッシュの有効期限を設定する際は、 IPv6をオフに設定してください。nginxはIPv6を優先的に使用するようですが、 DockerのDNS解決はIPv4を使用するため、解決エラーが発生する可能性があります。

ステップ2:サービスアドレスを変数に格納する

変数を設定するには、 set $something http://some-service:portを使用し、次にproxy_pass変数として渡します。

結果

上記の変更を加えることで、 Nginxは実行されていないサービスに遭遇した場合、エラーページを返しますが、直接終了することはありません。サービスが起動した後、 Nginxを再起動することなく、再度ページにアクセスできるようになります。