2015-09-29 5 views
48

Nous avons plusieurs applications de rails sous domaine commun dans Docker, et nous utilisons nginx pour diriger les demandes vers des applications spécifiques.Configuration nginx ne pas se bloquer si l'hôte en amont n'est pas trouvé

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

Config ressemble à ceci:

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... 
} 

Si l'une de ces applications n'est pas démarré alors nginx échoue et arrête:

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

Nous ne les avons pas besoin de les être en place mais nginx échoue autrement. Comment faire pour que nginx ignore les flux ascendants échoués?

+0

Êtes-vous liez les conteneurs d'applications avec les conteneurs Nginx, ou les exécuter séparés les uns des autres? Si l'hôte dans le bloc 'upstream' ne se résout pas, au moment de l'exécution, alors Nginx va sortir avec l'erreur ci-dessus ... – Justin

+0

Si vous pouvez utiliser une adresse IP alors il va démarrer très bien. L'utilisation de 'resolver' (http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) fonctionnerait-elle dans votre cas? – Justin

+0

@Justin nous avons chaque application dans un conteneur séparé, nginx aussi. Reliez-les avec docker –

Répondre

39
  1. Si vous pouvez utiliser une adresse IP statique, puis il suffit d'utiliser cela, il va démarrage et simplement revenir 503 « s si elle ne répond pas. Utilisez la directive resolver pour pointer vers quelque chose qui peut résoudre l'hôte, qu'il soit en cours ou non.

  2. résoudre au niveau location, si vous ne pouvez pas le ci-dessus (cela permettra Nginx pour démarrer/exécuter):

    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

votre option 3 fonctionne très bien pour moi. Si je ne spécifie pas de résolveur, savez-vous combien de temps nginx mettra en cache l'IP qu'il résout? –

+3

Merci! Le simple fait d'utiliser une variable semble empêcher nginx d'être intelligent à ce sujet – Blanka

+0

J'ai trouvé qu'un groupe de capture regex me permettait d'ignorer la variable: 'location ~ ^/foo /(.*)$ {proxy_pass http: // foo/$ 1; } ' –

4

L'avantage principal de l'utilisation upstream est pour définir un groupe de serveurs qui peut écouter sur différents ports et configurer l'équilibrage de charge et le basculement entre eux.

Dans votre cas, vous êtes que la définition 1 serveur principal par tant en amont il doit être en place. Au lieu de cela, utilisez des variables pour votre proxy_pass (es) et n'oubliez pas de gérer les erreurs possibles (404s, 503s) que vous pourriez obtenir quand un serveur cible est en panne.

-4

Vous ne pouvez pas utiliser l'option --link, mais vous pouvez utiliser le mappage de port et lier nginx à l'adresse hôte.

Exemple: Exécutez votre premier conteneur docker avec l'option -p 180:80, deuxième conteneur avec l'option -p 280:80.

Run nginx et définir ces adresses pour proxy:

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

et si créer dynamiquement un réseau de ceux-ci? – EralpB