Abbiamo diverse app rails sotto un dominio comune in Docker e usiamo nginx per indirizzare le richieste ad app specifiche.
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
La configurazione ha questo aspetto:
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...
}
Se una di queste app non viene avviata, nginx non riesce e si interrompe:
host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6
Non abbiamo bisogno che siano tutti attivi, ma nginx fallisce altrimenti. Come fare in modo che nginx ignori gli upstream falliti?
resolver
( nginx.org/en/docs/http/ngx_http_core_module.html#resolver ) funzionerebbe nel tuo caso?
proxy.sh
script che legge le variabili di ambiente e aggiunge dinamicamente le upstream
voci per ciascuna, quindi avvia Nginx. Funziona benissimo in quanto quando eseguiamo il nostro contenitore proxy possiamo passare gli upstream necessari in fase di esecuzione. Potresti fare qualcosa di simile per abilitare / disabilitare determinati upstream all'avvio (o come la mia configurazione aggiungi solo quelli necessari in fase di esecuzione)
upstream
blocco non si risolve, in fase di esecuzione, Nginx uscirà con l'errore precedente ...