2012-01-24 12 views
12

Supponiamo di avere diversi nodi identici che sono i server delle applicazioni di alcuni servizi di livello superiore. E supponiamo di usare Apache ZooKeeper per mantenere tutte le configurazioni della nostra applicazione distribuita. Inoltre abbiamo un nginx come bilanciamento del carico e reverse proxy di fronte a questa applicazione.C'è un modo per configurare nginx (o altro proxy rapido) dinamicamente?

Quindi diciamo che eseguiamo un comando che modifica i dati solo su node1, e per un certo periodo di tempo node2 differisce da node1. E vogliamo che il proxy reindirizzi tutte le richieste speciali (che necessitano di dati specifici) al nodo1 fino a quando tutte le informazioni sono state migrate su node2 e node2 ha gli stessi dati di node1.

C'è un modo per rendere nginx (o altro proxy) leggere la sua configurazione da Apache ZooKeeper? O più ampio: esiste un modo per cambiare in modo efficace la configurazione del proxy al volo? E ovviamente dovrebbe essere fatto senza (o con un minimo) downtime dell'intero sistema - quindi riavviare Nginx non è l'opzione.

+0

finché le informazioni completamente migrati verso un dato nodo si può restituire un codice 5xx da quel nodo? – Anatoly

risposta

34

Nginx ha due metodi di configurazione cambia:

  • HUP segnale ai risultati del processo master in "ricarica". Nginx avvia un gruppo di nuovi lavoratori e lascia che i vecchi lavoratori si chiudano con grazia, cioè finiscono le richieste esistenti. C'è no interruzione del servizio. Questo metodo di modifica della configurazione è molto leggero e veloce, ma presenta alcune limitazioni: non è possibile modificare le zone della cache o ricompilare gli script Perl.

  • USR2 segnale, quindi WINCH e poi QUIT al risultato processo di master in "aggiornamento eseguibile" e questa sequenza lascia completamente ri-leggere tutta la configurazione e persino aggiornare l'eseguibile Nginx. Ricarica anche le cache del disco (che potrebbe richiedere molto tempo). Questo metodo comporta l'interruzione del servizio no.

Official documentation

+1

Grazie! Non sono molto esperto in nginx, mi hai dato una buona informazione su cui riflettere. – Dima

+1

questa dovrebbe essere la risposta ufficiale –

0

Non è sicuro che sia possibile modificare dinamicamente la configurazione nginx senza riavviare un server.

Se avessi lo stesso requisito, probabilmente avrei scavato nell'integrazione nodejs e zookeeper.

Ci sono diversi interessanti progetti opensource:

node-zookeeper si integra con nodejszookeeper;

node-http-proxy server http proxy che può essere utilizzato per il bilanciamento del carico.

Naturalmente mancano di maturità ma potrebbero essere interessanti per voi.

+0

Grazie! Un'idea molto interessante, la controllerò. – Dima

+2

È possibile: 'nginx reload' – nilskp

+0

httpd' RewriteMap' direttiva utilizzando una mappatura database/file – Sebastian

2

come aggiornamento: Hipache memorizza la sua configurazione ospite in Redis, che può essere facilmente manipolata in fase di esecuzione. Si basa anche su node.js e node-http-proxy.

1

C'è un progetto interessante utilizzando nginx Lua per consentire la configurazione dinamica di nginx e di fare esattamente quello che vuoi (https://github.com/samalba/hipache-nginx)

È scritto dai ragazzi dietro Hipache.

1

Questo può essere in ritardo ma se avete i soldi. Nginx plus is exactly for you. Utilizza una semplice chiamata url per ottenere nuove configurazioni al volo.

+1

È $ 1900 all'anno per una singola istanza. – Miscreant

2

È possibile utilizzare HAProxy e l'interfaccia socket di dominio UNIX: http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#9.2.

Supporta il passaggio di un server o di un intero front-end dal basso verso l'alto e viceversa. Con un file di configurazione che definisce due insiemi di front-end, ciascuno configurato per uno stato specifico, è possibile ottenere ciò che si desidera.

4

Si prega di provare Nginx-Clojure. Possiamo usare un gestore di riscrittura clojure/java/groovy per accedere a zookeeper, quindi aggiornare alcune variabili nginx per modificare dinamicamente il target proxy. per esempio.

In nginx.conf

set $mytarget ""; 

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

In 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"); 
     }