2015-05-31 10 views
10

ich richtig verstehe, dass es falsch ist „reuseport“ für gleiche IP zu verwenden: PORT Paar auf verschiedenen virtuellen Hosts:Nginx des „reuseport“ für gleiche IP: Port-Paar auf verschiedenen virtuellen Hosts

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

Diese Config gibt mir:

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

oder

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

Also habe ich eindeutige IP zu verwenden: Port-Paare für jeden virtuellen Host?

In der gleichen Zeit Server-weite "listen 80 reuseport;" funktioniert gut, aber macht es dasselbe wie für eine eindeutige IP: PORT?

Antwort

4

Beantworten Sie Ihre letzte Frage - in nginx ist die listen Direktive nur im server Kontext (das heißt pro virtueller Host) erlaubt.

Nach manual:

Die listen Direktive kann mehrere zusätzliche Parameter spezifische müssen Buchse bezogene Systemaufrufe. Diese Parameter können in beliebige listen Direktive angegeben werden, aber nur einmal für ein gegebenes Adresse: Port-Paar.

Also, wenn Sie mehr als 1 virtuellen Host (server Definition in nginx config) haben, dann können Sie die Option reuseport in jedem 1 von ihnen. Nicht sockelbezogene Optionen (wie ssl oder spdy) können immer noch für mehr als 1 listen eingestellt werden.


SIDE HINWEIS: Was die reuseport Richtlinie wirklich tut:

Nginx von Version unterstützt 1.9.1 die SO_REUSEPORT TCP-Socket-Parametereinstellung. In modernen Betriebssystemen (Linux-Kernel seit 3.9) ermöglicht dies dem Kernel, mehr Socket-Listener für jeden Socket (ip: port) zu haben.

Ohne es, wenn neue Verbindung ankommt, benachrichtigt Kernel alle Nginx Arbeiter darüber und alle versuchen, accept es.

Wenn diese Option aktiviert ist, hat jeder Worker einen eigenen Listener-Socket und bei jeder neuen Verbindung wählt der Kernel einen von ihnen aus, der ihn empfängt - es gibt also keinen Konflikt.

Weitere Informationen über Vorteile, Nachteile und Benchmarks von reuseport Option kann auf dieser Nginx blog post

2

Nur eine listen Direktive pro port/ip Paar sollte die reuseport Option haben.

Also entfernen Sie einfach die reuseport von server2 vhost.

+0

gelesen werden Es ist gleich zu setzen „hören 80 reuseport;“ Serverweit? –

+0

Was Sie mit 'Server' meinen, ist unklar.zu klären: jeder Nginx-Server-Kontext pro Schema pro IP kann dies verwenden. Wenn Sie also ein nginx conf mit einem Server haben, der auf ip 1.2.3.4 spricht, der http spricht, und einem anderen nginx-Server, der auf 1.2.3.4 https hört, werden Sie 'reuseport' zweimal dort verwenden. Wenn Sie 1.2.3.4 mit demselben Schema (dh http oder https) mit einem anderen nginx conf-Server teilen, wird es dort automatisch aktiviert und nginx wird nicht korrekt geladen, wenn Sie versuchen, es erneut in diesem Server/ip/schema-Kontext zu setzen . – pozcircuitboy

Verwandte Themen