2015-05-31 15 views
10

Sono giusto capire che è sbagliato usare "reuseport" per lo stesso IP: coppia di porte su diversi host virtuali:di Nginx per lo stesso IP: coppia di porte su diversi host virtuali

http { 
    server { 
      listen  192.168.0.1:80 reuseport; 
      server_name server1; 
      … 
    } 
    server { 
      listen  192.168.0.1:80 reuseport; 
      server_name server2; 
      … 
    } 
} 

Questa configurazione mi dà:

nginx: [emerg] duplicate listen options for 192.168.0.1:80 in /etc/nginx/vhosts/server1.local.conf:66 

o

nginx: [emerg] listen() to 0.0.0.0:80, backlog 511 failed (98: Address already in use) 

Così ho da usare IP univoco: coppie di porte per ogni host virtuale?

A livello di server stesso "ascolta 80 reuseport"; funziona bene, ma sta funzionando come per IP univoco: PORT?

risposta

4

Risposta all'ultima domanda: in nginx, la direttiva listen è consentita solo nel contesto server (ovvero per host virtuale).

Secondo manual:

La direttiva listen può avere diversi parametri aggiuntivi specifico sistema di presa legati chiamate. Questi parametri possono essere specificati in qualsiasi direttiva listen, ma solo una volta per un dato indirizzo: coppia di porte.

Quindi, se avete più di 1 host virtuale (server definizione in config nginx), quindi è possibile utilizzare l'opzione reuseport in ogni 1 di loro. Le opzioni relative a non socket (come ssl o spdy) possono ancora essere impostate per più di 1 direttiva listen.


Nota a margine: ciò che la direttiva reuseport fa davvero:

Nginx dalla versione 1.9.1 supporta l'impostazione del parametro presa SO_REUSEPORT TCP. Nei sistemi operativi moderni (kernel Linux dalla versione 3.9), ciò consente al kernel di avere più listener di socket per ogni socket (ip: port).

Senza di esso, quando arriva una nuova connessione, il kernel ha notificato a tutti gli operatori di nginx e tutti provano a farlo accept.

Con questa opzione abilitata, ogni operatore ha il proprio socket di ascolto e su ogni nuova connessione, il kernel sceglie uno di essi che lo riceverà - quindi non c'è contesa.

Maggiori informazioni su vantaggi, gli svantaggi e parametri di riferimento di reuseport opzione può essere letto su questo Nginx blog post

2

Solo una direttiva di ascolto per coppia port/ip deve avere l'opzione reuseport.

Quindi basta rimuovere il reuseport da server2 vhost.

+0

E 'uguale per impostare "ascoltare 80 reuseport;" a livello di server? –

+0

che cosa intendi per "server" qui non è chiaro.per chiarire: ogni contesto del server nginx per schema per ip può usare questo. quindi se hai una conf nginx con un server in ascolto su IP 1.2.3.4 parlando di http e un altro server nginx in ascolto su 1.2.3.4 parlando di https, userai "reuseport" due volte lì. se si condivide 1.2.3.4 con lo stesso schema (ovvero http o https) con un altro server conf nginx, verrà automaticamente abilitato lì e nginx non verrà caricato correttamente se si tenta di impostarlo nuovamente in quel contesto server/ip/schema . – pozcircuitboy

Problemi correlati