Wir haben mehrere Rails-Apps unter einer gemeinsamen Domäne in Docker und verwenden Nginx, um Anfragen an bestimmte Apps zu leiten.
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
Die Konfiguration sieht folgendermaßen aus:
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...
}
Wenn eine dieser Apps nicht gestartet wird, schlägt nginx fehl und stoppt:
host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6
Wir brauchen nicht alle, um auf zu sein, aber Nginx schlägt sonst fehl. Wie kann man Nginx dazu bringen, fehlgeschlagene Upstreams zu ignorieren?
resolver
( nginx.org/en/docs/http/ngx_http_core_module.html#resolver ) in Ihrem Fall funktionieren?
proxy.sh
Skript enthält, das Umgebungsvariablen liest und upstream
für jedes dynamisch Einträge hinzufügt . Anschließend wird Nginx gestartet. Dies funktioniert insofern hervorragend, als wir beim Ausführen unseres Proxy-Containers zur Laufzeit die erforderlichen Upstreams übergeben können. Sie könnten etwas Ähnliches tun, um bestimmte Upstreams beim Start zu aktivieren / deaktivieren (oder wie mein Setup nur die zur Laufzeit benötigten hinzufügen)
upstream
Blocks zur Laufzeit nicht aufgelöst wird, wird Nginx mit dem obigen Fehler beendet ...