プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2023/02/16

Nginx で upstream の 名前解決を無効化(回避)する方法

event_note2023/02/16 4:10

Docker で動かしている Nginx でリバースプロキシの設定を行い、別の Docker コンテナに転送するように設定したときにちょっとはまったのでメモです。

コンテナ同士はコンテナ名を使ってアクセスできるので、Nginx の設定では以下のようにリバースプロキシの設定を行っています。

location /some_path {
    proxy_pass   http://container-name.docker-network:port;
}

このとき、Nginx は 起動時に upstream の名前解決を行っているので、上記の URL の名前解決ができない場合(つまり転送先のコンテナが起動していない)と host not found in upstream というエラーが表示されて起動に失敗します。

私の場合、仕様によって起動するコンテナの数が異なったり、開発中は一部のコンテナだけ起動して確認したりするので、その都度 Nginx の設定を変えるのは面倒です。
なので、名前解決できなくても Nginx が起動できるように回避策がないかと調べた所、以下の記事に書いてありました。

resolver のディレクティブを使って名前解決してやることで回避できるそうです。

location /some_path {
   resolver    127.0.0.1   valid=30s;   
   # resolver    8.8.8.8     valid=30s;   # or some other DNS
   # resolver    127.0.0.11  valid=30s;   # or Docker's DNS server
   set         $dummy_var  http://container-name.docker-network:port;
   proxy_pass  $dummy_var;
 }

私の場合、Nginx を Docker で動かしているので、127.0.0.11 をリゾルバに指定することで、転送先のコンテナが起動していなくても Nginx が起動できるようになりました。