Nous avons plusieurs applications de rails sous un domaine commun dans Docker et nous utilisons nginx pour diriger les demandes vers des applications spécifiques.
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
La configuration 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ée, nginx échoue et s'arrête:
host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6
Nous n'avons pas besoin de tous pour être en place, mais nginx échoue autrement. Comment faire en sorte que Nginx ignore les échecs en amont?
nginx
url-rewriting
proxypass
Morozov
la source
la source
upstream
bloc ne résout pas, au moment de l'exécution, Nginx se fermera avec l'erreur ci-dessus ...resolver
( nginx.org/en/docs/http/ngx_http_core_module.html#resolver ) fonctionnerait-elle dans votre cas?proxy.sh
script qui lit les variables d'environnement et ajoute dynamiquement desupstream
entrées pour chacune, puis démarre Nginx. Cela fonctionne très bien en ce que lorsque nous exécutons notre conteneur proxy, nous pouvons transmettre les flux amont nécessaires au moment de l'exécution. Vous pouvez faire quelque chose de similaire pour activer / désactiver certains amonts au lancement (ou comme ma configuration, ajoutez simplement ceux nécessaires à l'exécution)Réponses:
Si vous pouvez utiliser une adresse IP statique, utilisez-la simplement, elle démarrera et retournera simplement
503
si elle ne répond pas.Utilisez la
resolver
directive pour pointer vers quelque chose qui peut résoudre l'hôte, qu'il soit actuellement actif ou non.Résolvez-le au
location
niveau, si vous ne pouvez pas faire ce qui précède (cela permettra à Nginx de démarrer / s'exécuter) :la source
location ~ ^/foo/(.*)$ { proxy_pass http://foo/$1; }
Pour moi, l'option 3 de la réponse de @ Justin / @ duskwuff a résolu le problème, mais j'ai dû changer l'adresse IP du résolveur en 127.0.0.11 (serveur DNS de Docker):
Mais comme @ Justin / @ duskwuff l'a mentionné, vous pouvez utiliser n'importe quel autre serveur DNS externe.
la source
Le principal avantage de l'utilisation
upstream
est de définir un groupe de serveurs pouvant écouter sur différents ports et de configurer l'équilibrage de charge et le basculement entre eux .Dans votre cas, vous ne définissez qu'un seul serveur principal par amont, il doit donc être opérationnel .
À la place, utilisez des variables pour votre
proxy_pass
( vos ) et n'oubliez pas de gérer les erreurs possibles (404, 503) que vous pourriez obtenir lorsqu'un serveur cible est arrêté.la source
set $variable http://foo
etproxy_pass $variable
et que je garde le toto "en amont" (pour conserver les avantages que vous avez mentionnés), alors je rencontre toujours le problème mentionné par OP.set $variable foo
etproxy_pass http://$variable
J'ai eu le même problème «Hôte introuvable» car une partie de mon hôte était mappée en utilisant
$uri
au lieu de$request_uri
:Et lorsque la demande est devenue la sous-demande d'authentification, le a
$uri
perdu sa valeur initiale. Changer le mappage à utiliser$request_uri
au lieu de$uri
résoudre mon problème:la source
Vous ne pouvez pas utiliser d'
--link
option, à la place, vous pouvez utiliser le mappage de port et lier nginx à l'adresse hôte.Exemple: exécutez votre premier conteneur docker avec
-p 180:80
option, deuxième conteneur avec-p 280:80
option.Exécutez nginx et définissez ces adresses pour le proxy:
la source