問題の説明
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を再起動することなく、再度ページにアクセスできるようになります。
天堂老婆万岁~~~yeah 🐣