Certaines configurations de proxy inverse nginx cessent de fonctionner une fois par jour

12

J'ai un proxy inverse nginx qui procède aux requêtes d'un ELB amazon externe aux ELB internes.

J'ai 6 instances d'arrière-plan qui traitent les demandes. Les configurations activées par le site ressemblent à ceci, mais il existe différents numéros de port et proxy_pass. Tout le reste est identique:

server {
    listen 3000;
    location / {
            proxy_pass http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000;
            include /etc/nginx/proxy.conf;
    }

}

Toutes les 24 heures environ, l'une des configurations cesse de fonctionner. Tous les autres proxys fonctionnent bien. Si je redémarre nginx, toutes les configurations fonctionnent à nouveau. Il n'y a rien dans error.log, rien de bizarre dans le journal d'accès, syslog ou dmesg.

Est-ce quelque chose de connu? Ai-je fait quelque chose de mal avec mes configurations de proxy? Y a-t-il d'autres journaux dans lesquels je peux regarder?

user202172
la source

Réponses:

22

La réponse à cette question est que les ELB changent parfois les adresses IP et que nginx résout le nom lors du démarrage.

Pour résoudre ce problème, il y a toujours un serveur DNS dans votre VPC à 0,2. Donc, si l'IP CIDR local est 10.0.0.0/16, le serveur DNS est à 10.0.0.2.

Ajoutez ceci à la configuration nginx.

resolver 10.0.0.2 valid=10s;

Le proxy_pass doit également être défini comme une variable, sinon nginx ne le résoudra qu'une seule fois. Donc, basé sur la configuration ci-dessus, c'est la bonne configuration:

server {
    listen 3000;
    location / {
            resolver 10.0.0.2 valid=10s;
            set $backend "http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000"
            proxy_pass $backend;
            include /etc/nginx/proxy.conf;
    }
}
user202172
la source
Quelqu'un sait-il quelle version de nginx prend en charge les variables dans le paramètre proxy_pass? j'essaie un haricot élastique (nginx version 1.6.2) et il ne veut pas accepter la variable de toute façon je l'ai mis.
Stephen C
Merci pour cela, ça nous rend littéralement fous depuis environ un mois maintenant!
Jim.R
Cet article sur les répétitions de blocs nginx fait également écho à cette configuration. nginx.com/blog/dns-service-discovery-nginx-plus
Morgan Christiansson
1

Si votre proxy_pass n'est pas passé directement à une URL comme le montre votre exemple ( http://amazonaws.com ), mais plutôt à une batterie de serveurs proxy en amont, comme ceci:

upstream my_upstream {
 server1 127.0.0.1:1337;
 server2 127.0.0.1:1338; 
}
location / {
 proxy_pass         http://my_upstream;
}

Dans ce cas, vous serez moins préoccupé par la défaillance temporaire d'un des amonts. Parce qu'ils feront tous le même travail. Si l'un ne répond pas, le suivant sera mandaté pour cette réponse. Tranquillité d'esprit.

Nginx sautera automatiquement une machine en panne pendant x secondes. Jusqu'à ce que vous le répariez ou jusqu'à ce qu'il revienne de lui-même. ( http://wiki.nginx.org/HttpUpstreamModule )

Quelle que soit la raison de vos interruptions, en les distribuant sur une batterie en amont, cela se transforme en une configuration plus facile.

user18099
la source
Merci pour votre réponse! La chose étrange est que je peux faire une requête directement à l'instance backend mais pas via nginx. Si je redémarre simplement nginx, la demande est à nouveau mandatée. Comme c'est déjà dans un environnement de production, je veux vraiment savoir pourquoi l'une des configurations semble être "déchargée" ou comment je peux découvrir ce que nginx fait vraiment en coulisses.
user202172
Vous voudrez peut-être rechercher plus d'informations de journalisation nginx. Il s'agit d'un problème où quelqu'un a essayé, comme vous, d'en savoir plus sur les "problèmes intermittents [...] que je mandatais" " stackoverflow.com/questions/9914792/… Il décrit une manière d'extraire des journaux plus pertinents. J'espère que cela aide.
user18099