Alcune configurazioni del proxy inverso nginx smettono di funzionare una volta al giorno


12

Ho un proxy inverso nginx che inoltra richieste da un ELB amazon esterno a ELB interni.

Ho 6 istanze di backend che gestiscono le richieste. Le configurazioni abilitate per il sito si presentano così, ma ci sono numeri di porta e proxy_pass diversi. Tutto il resto è identico:

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

}

Una volta ogni 24 ore circa una delle configurazioni smette di funzionare. Tutti gli altri proxy funzionano bene. Se riavvio nginx, tutte le configurazioni funzionano di nuovo. Non c'è nulla in error.log, niente di strano nel registro degli accessi, syslog o dmesg.

Questo è noto? Ho fatto qualcosa di sbagliato con le mie configurazioni proxy? Ci sono altri registri in cui posso cercare?



Risposte:


22

La risposta a questa domanda è che gli ELB a volte cambiano gli indirizzi IP e nginx non si risolve il nome durante l'avvio.

Per risolvere questo problema c'è sempre un server DNS nel tuo VPC a 0.2. Quindi, se il CIDR ip locale è 10.0.0.0/16, il server DNS è 10.0.0.2.

Aggiungi questo alla configurazione di nginx.

resolver 10.0.0.2 valid=10s;

Proxy_pass deve anche essere definito come una variabile altrimenti nginx lo risolverà una sola volta. Quindi in base alla configurazione sopra questa è la configurazione corretta:

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

qualcuno sa quale versione di nginx supporta le variabili nell'impostazione proxy_pass? sto provando su beanstalk elastico (nginx versione 1.6.2) e non vuole accettare comunque la variabile in cui l'ho inserita.
Stephen C

Grazie per questo, ci sta letteralmente facendo impazzire da circa un mese!
Jim.R,

Questo articolo sulle ripetizioni del blocco nginx fa eco anche a questa configurazione. nginx.com/blog/dns-service-discovery-nginx-plus
Morgan Christiansson

1

Se il tuo proxy_pass non è passato direttamente a un URL come mostrato nell'esempio ( http://amazonaws.com ), ma invece a una farm upstream proxy, in questo modo:

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

Quindi sarai meno preoccupato per uno degli upstream che falliscono temporaneamente. Perché tutti faranno lo stesso lavoro. Se uno non riesce a rispondere, al successivo verrà inviato un proxy per quella risposta. Pace della mente.

Nginx salterà automaticamente una macchina guasta per x secondi. Fino a quando non lo ripari, o fino a quando non ritorna da solo. ( http://wiki.nginx.org/HttpUpstreamModule )

Quindi, qualunque sia la ragione delle tue interruzioni, distribuendole in una fattoria a monte, questo si trasforma in una configurazione più semplice.


Grazie per la tua risposta! La cosa strana è che posso fare una richiesta all'istanza di backend direttamente ma non tramite nginx. Se ho appena riavviato nginx, la richiesta viene nuovamente inviata. Dato che questo è già in ambiente di produzione, voglio davvero scoprire perché uno dei config sembra essere "scaricato" o come posso scoprire cosa nginx fa davvero dietro le quinte.
user202172

Quindi potresti voler cercare altre informazioni sulla registrazione di nginx. Questo è un problema in cui qualcuno ha tentato, come te, di saperne di più su "problemi intermittenti [...] che sto procurando" stackoverflow.com/questions/9914792/… Descrive un modo per estrarre registri più pertinenti. Spero che sia d'aiuto.
user18099
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.