equilibrio de carga de conmutación por error automática nginx

29

Estoy usando nginx y NginxHttpUpstreamModule para el equilibrio de carga. Mi configuración es muy simple:

upstream lb {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

server {
    listen  89;
    server_name localhost;

    location / {
            proxy_pass      http://lb;
            proxy_redirect  off;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Pero con esta configuración, cuando uno de los 2 servidores back-end está inactivo, nginx aún dirige la solicitud a él y resulta en un tiempo de espera la mitad del tiempo :(

¿Hay alguna solución para hacer que nginx enrute automáticamente la solicitud a otro servidor cuando detecta un servidor caído?

Gracias.

robinmag
fuente

Respuestas:

33

Creo que es porque nginx no está detectando que el flujo ascendente está inactivo porque está en la misma máquina.

Las opciones que está buscando son: proxy_next_upstream y proxy_connect_timeout .

Prueba esto:

location / {
        proxy_pass              http://lb;
        proxy_redirect          off;
        proxy_next_upstream     error timeout invalid_header http_500;
        proxy_connect_timeout   2;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
}
Guillaume Filion
fuente
Estaba teniendo problemas con una configuración incompleta de Apache / PHP (archivos de biblioteca PEAR faltantes) que arrojaban errores http 500. proxy_next_upstream acaba de volver a intentarlo en la otra máquina, eso sí devolvió OK.
Alister Bulman
55
¿Por qué está desactivado proxy_redirect?
Seun Osewa
2

Hola, por favor vea el wiki: http://wiki.nginx.org/NginxHttpUpstreamModule#server

Básicamente, si se detecta una falla, el backend se marcará como inactivo durante x segundos e intentará nuevamente. Entonces, si sigue viendo conexiones, es probable que nginx siga verificando si el backend está disponible.

Sin embargo, debería intentar la siguiente entrada en el bloque ascendente, por lo que no debería ver que no hay backends disponibles si solo uno está inactivo.

Martin Fjordvald
fuente