Home > Software engineering >  Nginx use fallback upstream server if default server is not reachable
Nginx use fallback upstream server if default server is not reachable

Time:01-02

I am currently working on a Nginx config to group some of my docker containers into subdomains. Some of these containers are not running permanently and prevent nginx from starting (with error host not found in upstream "somecontainer:5000" in /etc/nginx/conf.d/default.conf:48) because the host defined in the upstream is not reachable. Is there a way to set a fallback upstream server in case the first one is not running?

The config currently looks like that:

upstream somecontainer {
    server somecontainer:5000;
    # here i need something like: if host is unreachable
    # server fallbackserver:5000
}

server {
     listen 443 ssl http2;
     server_name some.subdomain.com;
     root /public_html/;

     client_max_body_size 16384m;

     ssl on;
     server_tokens off;
     ssl_certificate sslstuff;
     ssl_certificate_key sslstuff;

     ssl_buffer_size 8k;
     ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
     ssl_prefer_server_ciphers on;
     ssl_ciphers ECDH AESGCM:ECDH AES256:ECDH AES128:DH 3DES:!ADH:!AECDH:!MD5;

     location / {
        proxy_pass        http://somecontainer;
        proxy_set_header  Host              $http_host;  
        proxy_set_header  X-Real-IP         $remote_addr; 
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_read_timeout                  900;
    }
}

CodePudding user response:

Unfortunately, it's because of Nginx design.

You can use variable in proxy_pass which will be resolved at runtime, so there is no such error on nginx load:

        set $destination_host somecontainer;
        proxy_pass http://$destination_host:5000;

But the disadvantage of the solution above is that you can not leverage nginx upstream such as specify load balancing algorithm or weighted balancing...

Additionally, You have to patch nginx if both upstream and dynamic service initialization is a need. I have a patch which change that Nginx design and was discussed here and I'm using it on production environment for a while. You can check it if patching is not a problem to you https://github.com/ZigzagAK/ngx_dynamic_upstream/issues/8#issuecomment-814702336

  • Related