Richtige Verwendung von Reuseport im virtuellen Nginx-Host

Richtige Verwendung von Reuseport im virtuellen Nginx-Host

Ich verwende Nginx als Reverse-Proxy mit einem Gunicorn-Anwendungsserver (Django-App).

In meiner Nginx-Virtual-Host-Datei gibt es zwei serverBlöcke. Der erste leitet wwwden Verkehr an den zweiten weiter (der den Verkehr verarbeitet non-www) https.

Im Einzelnen lautet der ehemalige Standortblock:

server {

    server_name www.example.com;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    return 301 https://example.com$request_uri;
}

Der letzte Standortblock ist:

server {

    server_name example.com;
    listen 443 ssl http2 reuseport;
    listen [::]:443 ssl http2 reuseport;

    # other directives here
}

Beachten Sie die Verwendung von reuseportim letzten Block.

Wenn ich reuseportbeide Blöcke eingebe, erhalte ich eine Fehlermeldung: nginx: [emerg] duplicate listen options for 0.0.0.0:443 in /etc/nginx/sites-enabled/vhost:62.

Wenn ich es nur in den vorherigen Block einfüge, funktioniert es. Ich bin hin- und hergerissen, wo ich es richtig platzieren soll, im vorherigen oder im letzten Block. Kann das jemand klären?


Ich verstehe, dass der reuseportParameter nginx anweist, für jeden Arbeitsprozess einen individuellen Abhörsocket zu erstellen, wodurch der Kernel eingehende Verbindungen zwischen Arbeitsprozessen verteilen kann (um mehrere zwischen Client und Server gesendete Pakete zu verarbeiten).

Aber das hilft mir nicht zu verstehen, warum ich es nicht reuseportin beiden meiner oben genannten Blöcke verwenden kann, oder in welchem ​​ich es verwenden soll (da ich es nur in einem verwenden kann).

Antwort1

In NGINX geben Sie die Abhöroptionen des Netzwerk-Sockets nur einmal in der Konfiguration an und sie „gelten“ für alle anderen konfigurierten servers, die auf demselben Socket (Port) lauschen. ZitatDokumente:

Die Listen-Direktive kann mehrere zusätzliche Parameter haben, die speziell für Socket-bezogene Systemaufrufe gelten. Diese Parameter können in jeder Listen-Direktive angegeben werden, jedoch nur einmal für ein bestimmtes Adresse:Port-Paar.

Aus der Fehlermeldung müssen Sie also entschlüsseln, dass Sie reuseportfür jede eindeutige listenAdresse+jeden eindeutigen Port nur einmal eine Angabe machen dürfen.

Wie serverSie dies tun, hängt von Ihren Vorlieben ab. Als Regel und aus Gründen der Übersichtlichkeit schlage ich jedoch vor, eines der servers mit default_servereiner Direktive zu versehen, die:

Wenn vorhanden, wird der Server zum Standardserver für das angegebene Adresse:Port-Paar. Wenn keine der Anweisungen den Parameter default_server hat, wird der erste Server mit dem Adresse:Port-Paar der Standardserver für dieses Paar.

Platzieren Sie dann Ihre Abhöroptionen in diesem Serverblock (wo Sie das angegeben haben default_server).

Z.B

server {

    server_name www.example.com;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    return 301 https://example.com$request_uri;
}

server {

    server_name example.com;
    listen 443 ssl http2 default_server reuseport;
    listen [::]:443 ssl http2 default_server reuseport;

    # other directives here
}

verwandte Informationen