2015-09-29 13 views
48

Abbiamo diverse app di rotaia con dominio comune in Docker e usiamo nginx per indirizzare le richieste ad app specifiche.Setup nginx di non arrestarsi in modo anomalo se non è stato trovato l'host in upstream

our_dev_server.com/foo # proxies to foo app 
our_dev_server.com/bar # proxies to bar 

Config assomiglia a questo:

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 applicazioni non si avvia quindi nginx fallisce e si ferma:

host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6 

Non abbiamo bisogno di tutti loro di essere all'altezza ma nginx fallisce altrimenti. Come fare in modo che nginx ignori gli upstream falliti?

+0

Stai collegano i contenitori app con i contenitori Nginx, o in esecuzione li separano gli uni dagli altri? Se l'host all'interno del blocco 'upstream' non si risolve, in fase di esecuzione, Nginx uscirà con l'errore sopra riportato ... – Justin

+0

Se è possibile utilizzare un indirizzo IP, verrà avviato correttamente. L'uso di 'resolver' (http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) funzionerà nel tuo caso? – Justin

+0

@Justin abbiamo ogni app in un contenitore separato, anche nginx. Collegali con la finestra mobile –

risposta

39
  1. Se è possibile utilizzare un indirizzo IP statico, allora basta usare quello, che sarà messa in funzione e solo tornare 503 's se non risponde.

  2. Utilizzare la direttiva resolver per indicare qualcosa che può risolvere l'host, indipendentemente dal fatto che sia attualmente attivo o meno.

  3. risolverlo a livello location, se non si può fare quanto sopra (questo permetterà Nginx per avviare/run):

    location /foo { 
        resolver 127.0.0.1 valid=30s; 
        # or some other DNS (you company/internal DNS server) 
        #resolver 8.8.8.8 valid=30s; 
        set $upstream_foo foo; 
        proxy_pass http://$upstream_foo:80; 
    } 
    
    location /bar { 
        resolver 127.0.0.1 valid=30s; 
        # or some other DNS (you company/internal DNS server) 
        #resolver 8.8.8.8 valid=30s; 
        set $upstream_bar foo; 
        proxy_pass http://$upstream_bar:80; 
    } 
    
+0

l'opzione 3 funziona perfettamente per me. Se non si specifica un resolver, si sa per quanto tempo nginx memorizzerà nella cache l'IP che risolve? –

+3

Grazie! Il solo uso di una variabile sembra mantenere nginx dall'essere intelligente a riguardo – Blanka

+0

Ho scoperto che un gruppo di acquisizione regolare mi ha permesso di saltare la variabile: 'posizione ~ ^/foo /(.*)$ {proxy_pass http: // foo/$ 1; } ' –

4

Il principale vantaggio di utilizzare upstream è per definire un gruppo di server che possono essere ascoltati su porte diverse e configurare il bilanciamento del carico e il failover tra di loro.

Nel tuo caso si sono solo definire 1 server primario per upstream in modo esso deve essere su.

Invece, utilizzare le variabili per il tuo proxy_pass (es) e ricordarsi di gestire i possibili errori (404s, 503s) che si potrebbero ottenere quando un server di destinazione non è attivo.

-4

Non è possibile utilizzare l'opzione --link, è possibile invece utilizzare la mappatura delle porte e associare nginx all'indirizzo host.

Esempio: eseguire il primo contenitore finestra mobile con l'opzione -p 180:80, il secondo contenitore con l'opzione -p 280:80.

Run nginx e impostare questi indirizzi per il proxy:

proxy_pass http://192.168.1.20:180/; # first container 
proxy_pass http://192.168.1.20:280/; # second container 
+0

cosa succede se si crea dinamicamente una rete di questi? – EralpB

Problemi correlati