2012-01-24 15 views
12

Supongamos que tenemos varios nodos idénticos que son los servidores de aplicaciones de algún servicio n-tier. Y supongamos que utilizamos Apache ZooKeeper para mantener todas las configuraciones de nuestra aplicación distribuida. Además, tenemos un nginx como balanceador de carga y proxy inverso en frente de esta aplicación.¿Hay alguna forma de configurar nginx (u otro proxy inverso rápido) dinámicamente?

Digamos que realizamos un comando que cambia los datos solo en el nodo1, y durante un período de tiempo el nodo2 difiere del nodo1. Y queremos que el proxy redirija todas las solicitudes especiales (que necesitan datos específicos) al nodo 1 hasta que toda la información se haya migrado al nodo 2 y el nodo 2 tenga los mismos datos que el nodo 1.

¿Hay alguna manera de hacer que nginx (u otro proxy) lea su configuración desde Apache ZooKeeper? O más amplio: ¿hay alguna manera de cambiar de forma efectiva la configuración de proxy en marcha? Y, por supuesto, debe hacerse sin (o con un mínimo de) tiempo de inactividad de todo el sistema, por lo que reiniciar nginx no es la opción.

+0

hasta que la información migrado completamente a un nodo dado se puede devolver un código 5xx de ese nodo? – Anatoly

Respuesta

34

Nginx tiene dos métodos de configuración cambiante:

  • HUP señal a los resultados del proceso principal en "recarga". Nginx inicia un grupo de nuevos trabajadores y deja que los antiguos trabajadores cierren correctamente, es decir, finalizan las solicitudes existentes. No es no interrupción del servicio. Este método de cambio de configuración es muy ligero y rápido, pero tiene algunas limitaciones: no puede cambiar las zonas de caché ni volver a compilar los scripts de Perl. señal de

  • USR2, entonces WINCH y luego QUIT al resultado del proceso principal en "actualización ejecutable" y esta secuencia deja completamente re-leer la configuración entera e incluso actualizar el ejecutable Nginx. También recarga los cachés de disco (lo cual puede llevar mucho tiempo). Este método da como resultado no interrupción del servicio también.

Official documentation

+1

¡Gracias! Estoy lejos de ser un experto en nginx, me diste una buena información para pensar. – Dima

+1

esta debería ser la respuesta oficial –

0

No estoy seguro de que sea posible cambiar dinámicamente la configuración nginx sin reiniciar un servidor.

Si tuviera un mismo requisito, probablemente profundizaría en la integración de nodejs y zookeeper.

hay varios proyectos de código abierto interesantes:

node-zookeeper integra nodejs con zookeeper;

node-http-proxy servidor HTTP proxy que se puede usar para equilibrar la carga.

Por supuesto que carecen de madurez pero pueden ser interesantes para usted.

+0

Gracias! Idea muy interesante, lo verificare. – Dima

+2

Es posible: 'nginx reload' – nilskp

+0

httpd' RewriteMap' directive usando una base de datos/mapeo de archivos – Sebastian

2

como una actualización: Hipache almacena su configuración de host en redis, que puede ser fácilmente manipulado en tiempo de ejecución. También se basa en node.js y node-http-proxy.

1

Hay un interesante proyecto usando nginx Lua para permitir la configuración dinámica de Nginx y hacer exactamente lo que quiere (https://github.com/samalba/hipache-nginx)

Está escrito por los chicos detrás Hipache.

1

Esto puede ser tarde pero si tiene el dinero. Nginx plus is exactly for you. Utiliza una simple llamada url para obtener nuevas configuraciones sobre la marcha.

+1

Es $ 1900 por año para una sola instancia. – Miscreant

2

Es posible utilizar HAProxy y su interfaz de socket de dominio UNIX: http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#9.2.

Es compatible con la conmutación de un servidor o un front-end completo de abajo hacia arriba y de nuevo sobre la marcha. Con un archivo de configuración que define dos conjuntos de interfaces, cada uno configurado para un estado específico, podrá lograr lo que desee.

4

Por favor intente Nginx-Clojure. Podemos usar un manejador de reescritura clojure/java/groovy para acceder a zookeeper y luego actualizar algunas variables nginx para cambiar dinámicamente el proxy proxy. p.ej.

En nginx.conf

set $mytarget ""; 

location/{ 
    rewrite_handler_type java; 
    ## We will change $mytarget in MyRewriteHandler 
    rewrite_handler_name my.MyRewriteHandler; 
    proxy_pass $mytarget; 
} 

En MyRewriteHandler.java

public static class MyRewriteHandler implements NginxJavaRingHandler { 

     @Override 
     public Object[] invoke(Map<String, Object> request) { 
      //access zookeeper 
      ............... 
      //change nginx variable mytarget 
      ((NginxJavaRequest)request).setVaraible("mytarget", "http://some-host-or-url"); 
     } 
Cuestiones relacionadas