2015-09-08 15 views
7

Attualmente sto eseguendo due server back-end sulla mia rete e carico il bilanciamento con Nginx su Windows.Patching Nginx su ip_hash 4 ottetti invece di 3

Sto testando il sistema al momento, tuttavia tutto il mio traffico è diretto su un server. Questo perché l'algoritmo ip_hash ordina i traffici dai primi 3 ottetti, ad esempio 111.222.333.XXX

Questo è un problema perché tutto il traffico che sto mirando al server ha lo stesso indirizzo di base (Gli stessi primi 3 ottetti) quindi nessuno del mio traffico sta andando all'altro server. Qualcuno sa un modo per applicare patch o modificare l'algoritmo ip_hash per filtrare attraverso 4 ottetti.

Grazie

+0

perché non provare sessione appiccicosa o altri metodi LB: round-robin, least-connected, hash? – Anatoly

+0

Sto usando ip_hash. Ho provato a utilizzare il round-robin e meno connesso, tuttavia essi causano errori e non sembrano essere veloci nella mia situazione. Non sapevo che potevi appiccicarti in Nginx – Sprout

+0

@Anatoly mi dispiace non aver capito che c'era qualcosa come "hash" – Sprout

risposta

9

Nginx versione open source supporta l'hash direttiva che può funzionare in modo simile (non esattamente lo stesso però) al meccanismo della sessione sticky fornito dalla versione commerciale:

Il metodo hash generica : il server a cui viene inviata una richiesta è determinato da una chiave definita dall'utente che può essere un testo, una variabile o loro combinazione. Ad esempio, la chiave può essere una fonte IP e la porta, o URI:

upstream backend { 
    hash $request_uri consistent; 

    server backend1.example.com; 
    server backend2.example.com; 
} 

https://www.nginx.com/resources/admin-guide/load-balancer/

Così come si usa 4 ottetti da IPv4 con il metodo hash? Scopriamo come ottenere il client IP dalla sezione variabili integrate http://nginx.org/en/docs/http/ngx_http_core_module.html#variables

$ REMOTE_ADDR indirizzo del client

Così il codice è simile:

upstream backend { 
    hash $remote_addr consistent; 

    server backend1.example.com; 
    server backend2.example.com; 
} 

UPDATE:

Se date un'occhiata al modulo Stream (proxy TCP), il primo esempio mostra esatto lo stesso approccio:

upstream backend { 
    hash $remote_addr consistent; 

    server backend1.example.com:12345 weight=5; 
    server backend2.example.com:12345; 
    server unix:/tmp/backend3; 
} 

server { 
    listen 12346; 
    proxy_pass backend; 
} 
+1

Ottima risposta grazie mille – Sprout

+0

Suoni come dovrebbe funzionare, ma penso che non sia così. Stiamo ancora colpendo la stessa istanza ogni volta, in una rete locale/sottorete. Non tiene conto dell'ultimo ottetto IPv4. – stamster