Mamy kilka aplikacji railsowych w ramach wspólnej domeny w Dockerze i używamy nginx do kierowania żądań do określonych aplikacji.
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
Konfiguracja wygląda tak:
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...
}
Jeśli jedna z tych aplikacji nie zostanie uruchomiona, nginx zawiedzie i zatrzyma się:
host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6
Nie potrzebujemy ich wszystkich, ale w przeciwnym razie nginx zawodzi. Jak sprawić, by Nginx ignorował nieudane upstreams?
resolver
( nginx.org/en/docs/http/ngx_http_core_module.html#resolver ) zadziała w Twoim przypadku?
proxy.sh
skrypt, który czyta zmienne środowiskowe i dynamicznie dodaje upstream
wpisy dla każdego, a następnie uruchamia Nginx. Działa to świetnie, ponieważ kiedy uruchamiamy nasz kontener proxy, możemy przekazać potrzebne upstremy w czasie wykonywania. Możesz zrobić coś podobnego, aby włączyć / wyłączyć niektóre upstreams podczas uruchamiania (lub, tak jak moja konfiguracja, po prostu dodać te potrzebne w czasie wykonywania)
upstream
bloku nie zostanie rozwiązany, w czasie działania Nginx zakończy działanie z powyższym błędem ...