Ich verwende Nginx als Reverse-Proxy mit einem Gunicorn-Anwendungsserver (Django-App).
In meiner Nginx-Virtual-Host-Datei gibt es zwei server
Blöcke. Der erste leitet www
den 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 reuseport
im letzten Block.
Wenn ich reuseport
beide 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 reuseport
Parameter 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 reuseport
in 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 server
s, 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 reuseport
für jede eindeutige listen
Adresse+jeden eindeutigen Port nur einmal eine Angabe machen dürfen.
Wie server
Sie dies tun, hängt von Ihren Vorlieben ab. Als Regel und aus Gründen der Übersichtlichkeit schlage ich jedoch vor, eines der server
s mit default_server
einer 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
}