Dockerの共通ドメインの下にいくつかのRailsアプリがあり、nginxを使用してリクエストを特定のアプリに転送します。
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
構成は次のようになります。
upstream foo {
server foo:3000;
}
upstream bar {
server bar:3000;
}
# and about 10 more...
server {
listen *:80 default_server;
server_name our_dev_server.com;
location /foo {
# this is specific to asset management in rails dev
rewrite ^/foo/assets(/.*)$ /assets/$1 break;
rewrite ^/foo(/.*)$ /foo/$1 break;
proxy_pass http://foo;
}
location /bar {
rewrite ^/bar/assets(/.*)$ /assets/$1 break;
rewrite ^/bar(/.*)$ /bar/$1 break;
proxy_pass http://bar;
}
# and about 10 more...
}
これらのアプリのいずれかが起動していない場合、nginxは失敗して停止します。
host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6
すべてを起動する必要はありませんが、nginxは失敗します。nginxに失敗したアップストリームを無視させる方法は?
resolver
(nginx.org/en/docs/http/ngx_http_core_module.html#resolver)を使用するとうまくいきますか?
proxy.sh
環境変数を読み取りupstream
、それぞれに動的にエントリを追加してNginxを起動するスクリプトを含むNginxイメージを作成しました。これは、プロキシコンテナを実行するときに、実行時に必要なアップストリームを渡すことができるという点で優れています。起動時に特定のアップストリームを有効/無効にするのと同じようなことをすることができます(または私のセットアップのように実行時に必要なものを追加するだけです)
upstream
ブロック内のホストが解決しない場合、実行時にNginxは上記のエラーで終了します...