We have several rails apps under common domain in Docker, and we use nginx to direct requests to specific apps.
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
Config looks like this:
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...
}
If one of these apps is not started then nginx fails and stops:
host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6
We don't need them all to be up but nginx fails otherwise. How to make nginx ignore failed upstreams?
upstream
block doesn't resolve, at runtime, then Nginx will exit with the above error... – Suppressresolver
(nginx.org/en/docs/http/ngx_http_core_module.html#resolver) work in your case? – Suppressproxy.sh
script that reads environment variables and dynamically addsupstream
entries for each, then starts Nginx. This works great in that when we run our proxy container we can pass in the needed upstreams at runtime. You could do something similar to enable/disable certain upstreams at launch (or like my setup just add the ones needed at runtime) – Suppress