Algunas configuraciones de proxy inverso nginx dejan de funcionar una vez al día

12

Tengo un proxy inverso nginx que representa las solicitudes de un ELB externo de Amazon a los ELB internos.

Tengo 6 instancias de back-end que manejan las solicitudes. Las configuraciones habilitadas para el sitio se ven así, pero hay diferentes números de puerto y proxy_pass. Todo lo demás es idéntico:

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 vez cada 24 horas, una de las configuraciones deja de funcionar. Todos los demás servidores proxy funcionan bien. Si reinicio nginx, todas las configuraciones vuelven a funcionar. No hay nada en error.log, nada extraño en el registro de acceso, syslog o dmesg.

¿Es esto algo conocido? ¿He hecho algo mal con mis configuraciones de proxy? ¿Hay otros registros en los que pueda mirar?

usuario202172
fuente

Respuestas:

22

La respuesta a esta pregunta es que los ELB a veces cambian las direcciones IP y nginx resuelve los nombres durante el inicio.

Para solucionar esto, siempre hay un servidor DNS en su VPC en 0.2. Entonces, si el IP CIDR local es 10.0.0.0/16, el servidor DNS está en 10.0.0.2.

Agregue esto a la configuración de nginx.

resolver 10.0.0.2 valid=10s;

Proxy_pass también debe definirse como una variable; de ​​lo contrario, nginx solo lo resolverá una vez. Entonces, según la configuración anterior, esta es la configuración correcta:

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;
    }
}
usuario202172
fuente
¿Alguien sabe qué versión de nginx admite variables en la configuración proxy_pass? Estoy probando el beanstalk elástico (nginx versión 1.6.2) y no quiere aceptar la variable de todos modos, la puse.
Stephen C
Gracias por esto, ¡literalmente nos ha estado volviendo locos durante aproximadamente un mes!
Jim.R
Este artículo sobre repeticiones de bloques nginx también hace eco de esta configuración. nginx.com/blog/dns-service-discovery-nginx-plus
Morgan Christiansson
1

Si su proxy_pass no pasó directamente a una URL como se muestra en su ejemplo ( http://amazonaws.com ), sino a una granja de servidores ascendente proxy, como esta:

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

Entonces estará menos preocupado por una falla temporal de una de las cadenas ascendentes. Porque todos estarán haciendo el mismo trabajo. Si uno no responde, el próximo se representará para esa respuesta. Tranquilidad de espíritu.

Nginx omitirá una máquina fallida por x segundos automáticamente. Hasta que lo repare, o hasta que regrese por sí mismo. ( http://wiki.nginx.org/HttpUpstreamModule )

Entonces, cualquiera que sea la razón de sus interrupciones, al distribuirlas en una granja aguas arriba, esto se convierte en una configuración más fácil.

usuario18099
fuente
¡Gracias por su respuesta! Lo extraño es que puedo hacer una solicitud a la instancia de back-end directamente pero no a través de nginx. Si solo reinicio nginx, la solicitud se representa nuevamente. Como esto ya está en el entorno de producción, realmente quiero saber por qué una de las configuraciones parece estar "descargada" o cómo puedo averiguar qué hace realmente nginx detrás de escena.
user202172
Es posible que desee buscar más información de registro nginx entonces. Este es un problema en el que alguien intentó, como usted, averiguar más sobre "problemas intermitentes [...] que estoy proxying" stackoverflow.com/questions/9914792/... Describe una forma de extraer registros más relevantes. Espero eso ayude.
user18099