2015-09-29 5 views
48

gefunden Wir haben mehrere Schienen-Anwendungen unter einer gemeinsamen Domäne in Docker, und wir verwenden nginx, um Anforderungen an spezifische Anwendungen.-Setup nginx nicht zum Absturz bringen, wenn Host in Upstream nicht

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

Config sieht wie folgt 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 Anwendungen nicht gestartet wird, dann nginx ausfällt und stoppt:

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

Wir brauchen sie nicht alle bis zu sein aber nginx schlägt andernfalls fehl. Wie mache ich Nginx ignorieren fehlerhafte Upstreams?

+0

Sie verknüpfen die App-Container mit den Nginx Containern oder laufen sie voneinander trennen? Wenn der Host innerhalb des 'upstream' Blockes nicht löst, zur Laufzeit, dann wird Nginx mit dem obigen Fehler beenden ... – Justin

+0

Wenn Sie eine IP verwenden können, dann wird es Start-up in Ordnung. Würde mit 'resolver' (http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) Arbeit in Ihrem Fall? – Justin

+0

@Justin wir haben jede App in separaten Behältern zu nginx. Verknüpfen Sie sie mit Docker –

Antwort

39
  1. Wenn Sie eine statische IP verwenden können, dann, dass nur verwenden, es wird beim Start und Rückkehr nur 503 ‚s, wenn es nicht reagiert.

  2. Verwenden Sie die resolver Richtlinie etwas hinweisen, dass der Host auflösen kann, unabhängig davon, ob es zur Zeit auf oder nicht.

  3. Resolve es am location Ebene, wenn Sie die oben nicht tun kann (dies ermöglicht es Nginx/Lauf zu starten):

    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

Ihre Option 3 funktioniert gut für mich. Wenn ich keinen Resolver angegeben habe, wissen Sie, wie lange nginx die IP, die er löst, zwischenspeichert? –

+3

Danke! Die Verwendung einer Variablen scheint nginx davon abzuhalten, klug zu sein. – Blanka

+0

Ich habe festgestellt, dass eine Regex-Capture-Gruppe mir erlaubt, die Variable zu überspringen: 'location ~ ^/foo /(.*)$ {proxy_pass http: // foo/$ 1; } ' –

4

Der Hauptvorteil von upstream Verwendung ist Definieren Sie eine Gruppe von Servern, die auf verschiedenen Ports überwachen können, und konfigurieren Sie Load-Balancing und Failover zwischen ihnen.

In Ihrem Fall sind Sie nur definieren 1 primäre Server pro Upstream so es muss bis sein.

Verwenden Sie stattdessen Variablen für Ihre proxy_pass (es) und denken Sie daran, die möglichen Fehler (404s, 503s) zu behandeln, die Sie möglicherweise erhalten, wenn ein Zielserver ausgefallen ist.

-4

Sie können nicht --link Option verwenden, stattdessen können Sie Port-Mapping verwenden und nginx binden Adresse zu hosten.

Beispiel: Führen Sie den ersten Docker-Container mit der Option -p 180:80 aus, den zweiten Container mit der Option -p 280:80.

Run nginx und setzen diese Adressen für die Proxy:

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

Was, wenn dynamisch ein Netzwerk von diesen erstellen? – EralpB

Verwandte Themen