2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
[Einführung]: Nginx bietet eine Vielzahl von Reverse-Proxy-Unterstützungen auf Anwendungsebene, einschließlich Proxy_pass, uwsgi_pass, fastcgi_pass und scgi_pass usw. Unter anderem kann die Proxy_pass-Direktive einen URL-Parameter akzeptieren, um einen Reverse-Proxy für das HTTP/HTTPS-Protokoll zu implementieren; fastcgi_pass wird als Proxy für den FastCGI-Server verwendet; zur SCGI-Anwendung (Simple Common Gateway Interface). Diese Anweisungen ermöglichen es Nginx, verschiedene Arten von Backend-Diensten und -Anwendungen flexibel zu handhaben. Der Schwerpunkt dieses Artikels liegt auf scgi_pass.
SCGI(Simple Common Gateway Interface) Proxy istNginx Eine der wichtigsten unterstützten Reverse-Proxy-Methoden. In,SCGIist eine vereinfachte VersionCGI(Common Gateway Interface)-Protokoll, das eine effizientere Verbindung ermöglichen sollNetz Server und Anwendungen.mit traditionellCGIim Vergleich zu,SCGIDurch die Verwendung dauerhafter Verbindungen und eines vereinfachten Protokollformats wird der Overhead pro Anfrage erheblich reduziert.
SCGIDas Protokoll definiert einen standardisierten Weg dazuNetz Übergeben Sie Anforderungsinformationen und empfangen Sie Antworten zwischen dem Server und der Anwendung. Es verwendet ein einfaches Textformat zur Übertragung der Header-Informationen der Anfrage, gefolgt vom Anfragetext (falls vorhanden).Dieses Design machtSCGIEs ist einfach zu implementieren und bietet eine gute Leistung.
existierenNetzIn der AnwendungsarchitekturSCGIVerhielt sich wieNetzServer (z.BNginx ) und Back-End-Anwendungen.WannNginxvom Kunden erhaltenHTTPAuf Anfrage kann es diese Anfragen in umwandelnSCGIformatieren und dann übergebenSCGIDas Protokoll wird an den Backend-Anwendungsserver gesendet.
Dieser Ansatz eignet sich besonders für diejenigen, die nativ unterstützenSCGIProtokollprogrammiersprachen und Frameworks wie zPythoneinigeNetzRahmen (z.B.Flup)oderRubinEinige Anwendungsserver (z. BEinhorn ).durch die NutzungSCGI, können diese Anwendungen vermeidenHTTPDer Aufwand für das Parsen und die direkte Verarbeitung vonNetzAnfragen an den Server, wodurch die Gesamtleistung verbessert wird.
In praktischen AnwendungenSCGIZu den Nutzungsszenarien gehören unter anderem:
HochleistungNetzAnwendung: Für Anwendungen, die eine große Anzahl gleichzeitiger Anforderungen verarbeiten müssen,SCGIKann eine bessere Leistung erbringen als herkömmliche LösungenCGIBessere Leistung.
Lang laufende Prozesse: Bestimmte Anwendungen, die ihren Zustand aufrechterhalten müssen oder lange laufen, können dies tunSCGIUndNetzDer Server unterhält eine dauerhafte Verbindung.
Sprachspezifische Optimierungen: Bestimmte Programmiersprachen oder Frameworks können verwendet werdenSCGIzeigen eine bessere Leistung oder eine einfachere Implementierung.
Von inNginxbenutzt inscgi_pass
Befehl können Administratoren problemlos platzierenHTTPAnfrage an den Support weiterleitenSCGI Backend-Anwendungsserver.Dies vereinfacht nicht nur den Konfigurationsprozess, sondern bietet auch OptimierungsmöglichkeitenNetzAnwendungsleistung bietet Flexibilität.
SCGI(Simple Common Gateway Interface) ist ein vereinfachtes ProtokollCGIProtokoll, speziell entwickelt fürNetz Kommunikation zwischen Server und Anwendung. Es weist die folgenden herausragenden Merkmale auf:
Einfachheit:SCGI Das Protokoll verwendet ein einfaches Textformat zur Übertragung von Anforderungsheaderinformationen, was die Implementierung und das Debuggen des Protokolls relativ einfach macht. Die Designphilosophie des Protokolls besteht darin, es einfach zu halten und gleichzeitig ausreichende Funktionalität bereitzustellen.
Dauerhafte Verbindungen: versus traditionellCGIanders,SCGI Unterstützt dauerhafte Verbindungen.das bedeutet aSCGI Der Server kann mehrere Anfragen verarbeiten, ohne für jede Anfrage einen neuen Prozess oder Thread zu erstellen. Dadurch wird der Overhead der Systemressourcen erheblich reduziert und die Gesamtleistung verbessert.
Geringer Overhead: aufgrundSCGI Das Design des Protokolls ist einfach und verursacht bei der Anforderungsverarbeitung nur wenig zusätzlichen Overhead.Das machtSCGIBesonders geeignet für den Umgang mit hoher ParallelitätNetzAnwendungsszenarien.
Flexibilität:SCGI Das Protokoll ermöglicht die Übertragung beliebiger Header-Informationen, was Entwicklern große Flexibilität bietet. Entwickler können Header-Informationen nach Bedarf anpassen, um den Anforderungen bestimmter Anwendungen gerecht zu werden.
Sprachunabhängigkeit:SCGI Das Design des Protokolls ist unabhängig von der Programmiersprache.Dies bedeutet, dass es in jeder Programmiersprache implementiert werden kann, sodass Entwickler die Sprache auswählen können, die ihren Projektanforderungen am besten entspricht.SCGIServer.
ObwohlSCGIUndHTTPwerden verwendet fürNetzKommunikationsprotokolle, weisen jedoch erhebliche Unterschiede in den Designzwecken und Verwendungsszenarien auf:
Zielbenutzer:HTTPDas Protokoll wird hauptsächlich von Clients (z. B. Browsern) und verwendetNetzKommunikation zwischen Servern, währendSCGIDie Vereinbarung konzentriert sich aufNetzKommunikation zwischen Server- und Backend-Anwendungen.
Protokollkomplexität:HTTPDas Protokoll ist relativ komplex und enthält eine große Menge an Header-Informationen und Methoden zur Unterstützung verschiedenerNetz interaktive Szene. Im Gegensatz,SCGIDas Protokoll ist einfacher und enthält nur die notwendigen Informationen, um Anfragen und Antworten zu übermitteln.
Leistungsüberlegungen: inNetzWird zwischen Server und Anwendung verwendetSCGIanstattHTTPDer Overhead der Protokollanalyse kann reduziert werden, weilSCGI Das Format ist einfacher und direkter. Dies kann in Szenarien mit hoher Parallelität zu erheblichen Leistungsverbesserungen führen.
Verbindungsverwaltung:HTTP/1.1Das Konzept der dauerhaften Verbindungen wurde eingeführt, aber inNetzWird zwischen Server und Anwendung verwendetHTTPMöglicherweise ist noch ein zusätzliches Verbindungsmanagement erforderlich.SCGIDie integrierte Unterstützung für dauerhafte Verbindungen vereinfacht diesen Prozess.
Zu verwendende Szenen:HTTPEs ist das Grundprotokoll des Internets und kann auf verschiedene Arten angewendet werdenNetzKommunikationsszenario.SCGIwird hauptsächlich verwendet fürNetzInterne Kommunikation zwischen Servern und Back-End-Anwendungen, insbesondere in Szenarien, in denen eine Hochleistungsverarbeitung erforderlich ist.
SCGIUndFastCGIAlleCGIEine verbesserte Version vonNetz Anwendungsleistung. Sie weisen einige Gemeinsamkeiten, aber auch einige wesentliche Unterschiede auf:
Protokollkomplexität:SCGIÜbereinstimmungsverhältnisFastCGIeinfacher.SCGIVerwendet ein einfaches Textformat zur Übertragung von Header-InformationenFastCGI Verwenden Sie das Binärformat.Das machtSCGIEinfacher zu implementieren und zu debuggen, aber möglicherweise etwas schlechterFastCGILeistung.
Multiplexen:FastCGIUnterstützt die Verarbeitung mehrerer Anfragen über eine einzelne Verbindung (Multiplexing).SCGI Normalerweise wird nur eine Anfrage pro Verbindung verarbeitet. Dies bedeutet, dass in bestimmten Szenarien mit hoher ParallelitätFastCGIKönnte eine bessere Leistung erbringen.
Aufnahmetyp:FastCGIEs sind mehrere Datensatztypen definiert (z. B.STDIN、STDOUT、STDERRusw.), was eine feinkörnigere Steuerung ermöglicht.SCGIEs wird ein einfacherer Ansatz gewählt, der sich hauptsächlich auf die Übermittlung von Anfragen und Antworten konzentriert.
Sprachunterstützung: aufgrundFastCGI Je länger es existiert, desto weiter verbreitet dürfte seine Unterstützung in verschiedenen Programmiersprachen und Frameworks sein. Jedoch,SCGIAufgrund seiner Einfachheit ist die Implementierung in einigen Sprachen möglicherweise einfacher.
Leistung: In den meisten FällenSCGIUndFastCGI Der Leistungsunterschied ist nicht signifikant. Die Wahl des zu verwendenden Protokolls hängt oft von den spezifischen Anwendungsanforderungen, der Unterstützung der Entwicklungssprache und persönlichen Vorlieben ab.
existierenNginxKonfigurieren,scgi_pass
Die Direktive wird verwendet, um die Anfrage an weiterzuleitenSCGI Wichtige Anweisungen für den Server.es definiertNginxan die die Anfrage weitergeleitet werden sollSCGIServer oder Servergruppe.
scgi_pass
Die grundlegende Syntax des Befehls lautet wie folgt:
scgi_pass address;
In,address
Es kann in folgenden Formen vorliegen:
Zum Beispiel:scgi_pass localhost:9000;
in diesem Fall,NginxDie Anfrage wird an den Server weitergeleitet, der auf dem lokalen Host läuft und Port 9000 überwacht.SCGIServer.
Zum Beispiel:scgi_pass unix:/tmp/scgi.socket;
Hier,Nginxwird das angegebene übergebenUnixDomain-Socket mitSCGI Serverkommunikation.Diese Methode wird normalerweise verwendetSCGIServer mitNginxDie Ausführung auf demselben Computer kann zu einer besseren Leistung führen.
Zum Beispiel:scgi_pass scgi_backend;
In dieser Verwendungscgi_backend
ist einer inNginx Eine vordefinierte Upstream-Servergruppe in der Konfigurationsdatei. Dadurch können Sie erweiterte Funktionen wie Lastausgleich und Failover implementieren.
scgi_pass
Anweisungen liegen normalerweise vorlocation
Wird in Blöcken verwendet, um bestimmte Dinge zu behandelnURL Weg. Zum Beispiel:
location /scgi/ {
scgi_pass localhost:9000;
include scgi_params;
}
In diesem Beispiel alle/scgi/
Zu Beginn werden Anfragen an den lokalen Port 9000 weitergeleitet.SCGIServer.
include scgi_params;
Die Anweisung enthält eine vordefinierte Konfigurationsdatei, die eine Reihe von festlegtSCGI Parameter.Diese Parameter definierenNginxwie manHTTPDie Anforderungsinformationen werden konvertiertSCGIfragen.
Das ist erwähnenswertscgi_pass
Richtlinien können mit anderen kombiniert werdenNginx Direktiven werden in Kombination verwendet, um komplexere Konfigurationen zu erreichen.Sie können zum Beispiel verwendenif
Bedingte Anweisungen zur Auswahl verschiedener Optionen basierend auf unterschiedlichen BedingungenSCGIServer:
location / {
if ($request_method = POST) {
scgi_pass localhost:9001;
}
scgi_pass localhost:9000;
include scgi_params;
}
In diesem Beispiel,POSTAnfragen werden an Port 9001 weitergeleitet, während alle anderen Anfragen an Port 9000 weitergeleitet werden.
scgi_pass
Undproxy_pass
Es handelt sich bei allen um häufig verwendete Reverse-Proxy-Anweisungen, die alle Anforderungen an den Backend-Server weiterleiten.
In,scgi_pass
Konzipiert für die Verwendung mit UnterstützungSCGIProtokoll für die Backend-Server-Kommunikation.SCGIist eine vereinfachteCGIProtokoll, entwickelt fürNetz Effiziente Kommunikation zwischen Servern und Anwendungen. Im Gegensatz,proxy_pass
ist eine allgemeinere Direktive, die als Proxy für eine Vielzahl von Protokollen verwendet werden kann, darunterHTTP、HTTPS、FastCGIWarten.
In Benutzungscgi_pass
Stunde,Nginxwerde empfangenHTTPDie Anfrage wird in umgewandeltSCGIformatiert und dann an das Backend gesendetSCGI Server. Während dieses ProzessesNginx Übernimmt die Protokollkonvertierung, um sicherzustellen, dass der Back-End-Server die Anfrage richtig verstehen und verarbeiten kann.Undproxy_pass
Es wird normalerweise verwendet, um die Anfrage ohne Protokollkonvertierung unversehrt an den Backend-Server weiterzuleiten.
Ein weiterer wichtiger Unterschied besteht in der Konfiguration.scgi_pass
Erfordert normalerweise Kooperationscgi_param
Direktive, die zum Festlegen verwendet werden sollSCGI Für das Protokoll erforderliche Parameter. Zum Beispiel:
location /app/ {
scgi_pass localhost:9000;
include scgi_params;
scgi_param SCRIPT_FILENAME /path/to/app$fastcgi_script_name;
}
In diesem Beispiel,include scgi_params
vordefiniert eingeführtSCGIParameter, währendscgi_param
Direktiven werden verwendet, um zusätzliche Parameter festzulegen.
Im Gegensatz,proxy_pass
Die Konfiguration ist in der Regel einfacher und unkomplizierter:
location /api/ {
proxy_pass http://backend_server;
}
Was die Leistung angeht,scgi_pass
Undproxy_pass
Jedes hat seine eigenen Vorteile.Speziell für den Einsatz konzipiertSCGIProtokollanwendung,scgi_pass
kann eine bessere Leistung bieten, weil es vermeidetHTTP Protokoll-Overhead. Jedoch,proxy_pass
Seine Vielseitigkeit macht es flexibler und kann an verschiedene Backend-Server und Protokolle angepasst werden.
Auch die Sicherheit ist ein zu berücksichtigender Aspekt.Weilscgi_pass
gewidmetSCGI Protokoll, das in manchen Fällen eine bessere Sicherheit bieten kann, da es die Kommunikation mit dem Backend-Server einschränkt.Undproxy_pass
Aufgrund seiner Vielseitigkeit kann eine zusätzliche Konfiguration erforderlich sein, um die Sicherheit zu gewährleisten, insbesondere beim Umgang mit sensiblen Daten.
Wählen Sie in praktischen Anwendungen die Verwendungscgi_pass
Trotzdemproxy_pass
Hängt hauptsächlich von den Eigenschaften und Anforderungen der Backend-Anwendung ab.Wenn die Backend-Anwendung speziell für die Verwendung konzipiert istSCGIEinigung alsoscgi_pass
Könnte eine bessere Wahl sein.Wenn das Backend ein Standard istNetzServer oder Anwendung, nicht unterstützt oder erforderlichSCGI,Alsoproxy_pass
könnte passender sein.
scgi_pass
Die Anweisung istNginxbei der Verarbeitung verwendetSCGI (Simple Common Gateway Interface) Kernanweisungen angefordert. Die Funktionsweise umfasst mehrere Schritte, vom Empfang einer Kundenanfrage bis zur Rücksendung einer verarbeiteten Antwort an den Kunden.
Zunächst einmal, wannNginxVon einem Kunden erhaltenHTTP Wenn eine Anfrage gestellt wird, entscheidet es anhand der Regeln in der Konfigurationsdatei, wie mit der Anfrage umgegangen wird.Wenn die Anfrage übereinstimmt, verwenden Siescgi_pass
der Ortsblock der Anweisung,Nginxwird beginnenSCGIVerarbeitungsablauf.
existierenSCGIWährend des VerarbeitungsprozessesNginxZuerst erstellen wir dieSCGI Serververbindung.Diese Verbindung kann seinTCPSteckdose bzwUnixDomain-Socket, abhängig vonscgi_pass
Die in der Anweisung angegebene Adresse. Wenn eine Upstream-Servergruppe verwendet wird,NginxEin bestimmter Server wird auch basierend auf dem konfigurierten Lastausgleichsalgorithmus ausgewählt.
Nachdem die Verbindung hergestellt wurde,NginxWilleHTTPDie Anfrage wird in umgewandeltSCGI Format.Dieser Prozess umfasst das ErstellenSCGIAnforderungsheader und Anforderungstext.SCGIDer Anforderungsheader enthält eine Reihe von Schlüssel-Wert-Paaren, die Metadaten zur Anforderung bereitstellen, z. B. Anforderungsmethode, Pfad, Abfragezeichenfolge und ClientIP Adresse usw.Die meisten dieser Informationen stammen aus dem OriginalHTTPAnforderungsheader, können aber auch enthaltenscgi_param
Zusätzliche Parameter, die durch den Befehl festgelegt werden.
SCGI Das Format des Anforderungsheaders ist spezifisch: Er beginnt mit einer Zahl, die die Länge des gesamten Headers angibt, gefolgt von einem Doppelpunkt, dann einer Reihe von Schlüssel-Wert-Paaren, die mit einem Nullzeichen abgeschlossen werden, und endet schließlich mit einem Komma.Zum Beispiel eine vereinfachteSCGIDer Anforderungsheader könnte so aussehen:
70:CONTENT_LENGTH27SCGI1REQUEST_METHODGETquery_string,
In diesem Beispiel stellt „70“ die Gesamtlänge des Headers dar, gefolgt von drei Schlüssel-Wert-Paaren:CONTENT_LENGTH
、SCGI
UndREQUEST_METHOD
。
Nach dem Senden des AnforderungsheadersNginx Der Anfragetext wird gesendet (falls vorhanden).fürERHALTENAnfragen haben normalerweise keinen Anfragetext, sondern zPOSToderSETZENAnfrage: Der Anfragetext kann Formulardaten oder andere Arten von Inhalten enthalten.
SCGI Nachdem der Server die Anfrage empfangen hat, verarbeitet er die Anfrage und generiert eine Antwort.Die Antwort wird über dieselbe Verbindung zurückgesendetNginx。SCGIDas Format der Antwort ist relativ einfach. Es enthält Antwortheader und Antworttext, getrennt durch eine Leerzeile.
NginxerhaltenSCGINach der Antwort des Servers wird es wieder konvertiertHTTP Antwortformat.Dieser Prozess umfasst das ParsenSCGIAntwortheader, entsprechend eingestelltHTTPAntwortheader und übergeben Sie dann den Antworttext intakt an den Client.
im gesamten Prozess,Nginx Außerdem ist er für die Verwaltung des Lebenszyklus der Verbindung verantwortlich.Dazu gehören die Behandlung von Verbindungszeitüberschreitungen und die Verwaltung des Verbindungspoolings (falls aktiviert).keepalive
), Netzwerkfehler behandeln usw. Sollte bei der Verarbeitung ein Fehler auftreten,NginxEntsprechend der Konfiguration wird eine entsprechende Fehlerantwort an den Client zurückgegeben.
Zusätzlich,scgi_pass
Der Arbeitsprozess ist nicht blockierend.das heisstNginxKann mehrere verarbeitenSCGI Anfragen, ohne für jede Anfrage einen neuen Prozess oder Thread zu erstellen.Dieses Design machtNginxFähigkeit, eine große Anzahl gleichzeitiger Verbindungen effizient zu verarbeiten.
existierenNginxMittlere Konfigurationscgi_pass
Das grundlegende Beispiel ist relativ einfach.Diese Konfiguration ermöglichtNginxLeiten Sie Anfragen für einen bestimmten Pfad an weiterSCGI Server. Hier ist ein grundlegendes Konfigurationsbeispiel:
Zuerst öffnenNginxDie Hauptkonfigurationsdatei, normalerweise unter/etc/nginx/nginx.conf
oder/usr/local/nginx/conf/nginx.conf
.In dieser Datei müssen wirhttp
Innerhalb eines Blocks hinzufügen oder ändernserver
Stück.
existierenserver
Block, wir werden einen hinzufügenlocation
-Direktive, um zu definieren, an welche Anfragen weitergeleitet werden sollSCGI Server.Zum Beispiel, wenn wir alle hinzufügen möchten/scgi/
Die Anfrage zu Beginn wird an den Server weitergeleitet, der auf dem lokalen Port 9000 läuft.SCGIServer können Sie die folgende Konfiguration verwenden:
http {
server {
listen 80;
server_name example.com;
location /scgi/ {
scgi_pass localhost:9000;
include scgi_params;
}
}
}
In dieser Konfigurationlisten 80
Anweisungen sagenNginxHören Sie auf Port 80 (Standard).HTTPHafen).server_name
Die Direktive definiert den Domänennamen, auf den dieser Serverblock antworten soll.
location /scgi/
Block definiert alles/scgi/
AnfangURL Alle Anfragen sollten bearbeitet werden.Innerhalb dieses Blocks verwenden wirscgi_pass
Befehl zum AngebenSCGI Die Adresse und der Port des Servers. In diesem Beispiel,SCGIDer Server läuft auf demselben Computer (localhost
) von Port 9000.
include scgi_params;
Die Anweisung enthält eine vordefinierte Konfigurationsdatei, die eine Reihe von festlegtSCGI Parameter.Diese Parameter definierenNginxwie manHTTPDie Anforderungsinformationen werden konvertiertSCGI fragen.Normalerweise befindet sich diese Datei/etc/nginx/scgi_params
oder/usr/local/nginx/conf/scgi_params
。
Wenn deinSCGIDer Server benötigt zusätzliche Parameter, die verwendet werden könnenscgi_param
Befehl zum Festlegen.Zum Beispiel, wenn Sie eine Einstellung vornehmen müssenSCRIPT_FILENAME
Parameter können wie folgt konfiguriert werden:
location /scgi/ {
scgi_pass localhost:9000;
include scgi_params;
scgi_param SCRIPT_FILENAME /path/to/your/scripts$fastcgi_script_name;
}
Hier,SCRIPT_FILENAME
Der Parameter wird auf den tatsächlichen Pfad zum Skript gesetzt.$fastcgi_script_name
Ist einNginxVariable, die den angeforderten Skriptnamen darstellt.
Wenn deinSCGIServernutzungUnixstattdessen einen Domänen-Socket verwendenTCPDer Port kann wie folgt konfiguriert werden:
location /scgi/ {
scgi_pass unix:/tmp/scgi.socket;
include scgi_params;
}
In diesem Beispiel,Nginxwird über lokalisiert/tmp/scgi.socket
vonUnixDomain-Socket mitSCGIServerkommunikation.
Nachdem die Konfiguration abgeschlossen ist, müssen Sie sie neu laden oder neu startenNginx damit die Änderungen wirksam werden. Folgende Befehle können verwendet werden:
sudo nginx -s reload
oder
sudo systemctl restart nginx
Diese Grundkonfiguration ist zu verwendenscgi_pass
Bietet einen guten Ausgangspunkt. Abhängig von Ihren spezifischen Anforderungen können weitere Anpassungen und Optimierungen erforderlich sein. Beispielsweise müssen Sie möglicherweise Pufferung und Zeitüberschreitungen konfigurieren oder Upstream-Servergruppen für den Lastausgleich einrichten. Diese Konfigurationsoptionen werden in den folgenden Kapiteln ausführlich besprochen.
existierenNginx Mit dem Upstream-Modul können wir eine Reihe von Servern definieren, die für Lastausgleich und Failover verwendet werden können.Wenn mitscgi_pass
Das Upstream-Modul kann erheblich verbessert werden, wenn es in Verbindung mit Anweisungen verwendet wirdSCGIFlexibilität und Zuverlässigkeit der Agenten.
Die grundlegende Syntax des Upstream-Moduls lautet wie folgt:
upstream backend_name {
server address1;
server address2;
# 更多服务器...
}
In dieser Konfigurationbackend_name
ist der Name, den Sie für diese Servergruppe angegeben haben und der später verwendet werden kannscgi_pass
in der Richtlinie zitiert.jedeserver
Die Direktive definiert die Adresse eines Backend-Servers, der sein kannIPAdresse plus Portnummer, die auch sein kannUnixDomänen-Socket-Pfad.
Beispielsweise können wir eine Datei mit dem Namen definierenscgi_servers
Upstream-Gruppe:
upstream scgi_servers {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server unix:/tmp/scgi.socket;
}
Nachdem wir Upstream definiert haben, können wirscgi_pass
Verwenden Sie es in der Direktive:
location /app/ {
scgi_pass scgi_servers;
include scgi_params;
}
Also,NginxDie Anfrage wird weitergeleitet anscgi_servers
Server in der Gruppe.
Das Upstream-Modul bietet eine Vielzahl von Lastausgleichsalgorithmen, die durch Hinzufügen von Parametern nach der Serveranweisung konfiguriert werden können:
Round-Robin (Standard): Verteilen Sie Anforderungen nacheinander an jeden Server.
Gewichtetes Polling: Sie können für jeden Server eine Gewichtung festlegen. Server mit höherer Gewichtung erhalten mehr Anfragen. Zum Beispiel:
upstream scgi_servers {
server 127.0.0.1:9000 weight=3;
server 127.0.0.1:9001 weight=1;
}
least_conn
Anweisung:upstream scgi_servers {
least_conn;
server 127.0.0.1:9000;
server 127.0.0.1:9001;
}
ip_hash
Anweisung:upstream scgi_servers {
ip_hash;
server 127.0.0.1:9000;
server 127.0.0.1:9001;
}
Das Upstream-Modul bietet außerdem Serverzustandsprüfung und Failover-Funktionalität.Zum Beispiel können wir verwendenmax_fails
Undfail_timeout
Parameter zur Konfiguration der Fehlererkennung:
upstream scgi_servers {
server 127.0.0.1:9000 max_fails=3 fail_timeout=30s;
server 127.0.0.1:9001 max_fails=3 fail_timeout=30s;
}
Wenn in dieser Konfiguration ein Server innerhalb von 30 Sekunden dreimal hintereinander ausfällt,NginxEs wird als nicht verfügbar markiert und in den nächsten 30 Sekunden werden keine weiteren Anfragen an es gesendet.
Darüber hinaus können wir verwendenbackup
Parameter zur Angabe eines Backup-Servers, der nur verwendet wird, wenn alle Primärserver nicht verfügbar sind:
upstream scgi_servers {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002 backup;
}
Durch die ordnungsgemäße Verwendung des Upstream-Moduls können wir ein hochverfügbares und leistungsstarkes Modul aufbauenSCGI Agentencluster. Dies verbessert nicht nur die Gesamtleistung der Anwendung, sondern erhöht auch die Zuverlässigkeit und Fehlertoleranz des Systems. In praktischen Anwendungen sollten wir geeignete Lastausgleichsstrategien und Failover-Mechanismen basierend auf spezifischen Anforderungen und Szenarien auswählen, um die beste Systemleistung zu erzielen.
In der KonfigurationNginxvonscgi_pass
Direktive müssen wir zwei Hauptoptionen angebenSCGIServeradresse:UnixDomain-Socket undTCP Steckdose. Beide Methoden haben ihre eigenen Vor- und Nachteile. Die Wahl der Methode hängt von den spezifischen Anwendungsszenarien und Anforderungen ab.
UnixDomänen-Sockets sind eine Art Interprozesskommunikation (IPC ) Mechanismus, der es Prozessen auf derselben Maschine ermöglicht, effizient zu kommunizieren.existierenNginxKonfigurieren,Unix Die Adresse eines Domänen-Sockets wird normalerweise als Dateipfad dargestellt. Zum Beispiel:
scgi_pass unix:/tmp/scgi.socket;
verwendenUnix Der Hauptvorteil von Domain-Sockets ist ihre Leistung.Da die Kommunikation auf demselben Computer erfolgt und daher nicht über den Netzwerkprotokollstapel erfolgen mussUnixDomain-Sockets sind normalerweise kleiner alsTCP Steckdosen sind schneller.sie meidenTCP/IP Der durch das Protokoll verursachte Overhead, wie z. B. Kapselung und Entkapselung von Datenpaketen, Netzwerküberlastungskontrolle usw.Das machtUnixBesonders geeignet sind Domain-SocketsNginxUndSCGIDer Server läuft auf derselben Maschine.
Ein anderer nutztUnix Der Vorteil von Domain-Sockets ist die Sicherheit. Da die Kommunikation auf den lokalen Computer beschränkt ist, ist sie natürlich immun gegen Angriffe aus dem gesamten Netzwerk. Darüber hinaus können Dateisystemberechtigungen verwendet werden, um den Zugriff auf Socket-Dateien zu steuern und so eine zusätzliche Sicherheitsebene bereitzustellen.
Jedoch,Unix Auch Domain-Sockets haben ihre Grenzen. Am offensichtlichsten ist, dass sie nur für die Kommunikation zwischen Prozessen auf derselben Maschine verwendet werden können.WennNginxUndSCGIDer Server muss auf einem anderen Computer laufen und kann daher nicht verwendet werdenUnixDomain-Socket.
Im Gegensatz,TCPSocket-NutzungIP Adresse und Portnummer zur Angabe der Serveradresse. Zum Beispiel:
scgi_pass 127.0.0.1:9000;
TCP Der Hauptvorteil von Steckdosen ist die Flexibilität.Sie erlaubenNginxUndSCGI Server laufen auf verschiedenen Maschinen, was für verteilte Systeme oder Anwendungen erforderlich ist, die horizontale Skalierbarkeit erfordern.verwendenTCPSockets können wir problemlos einen Lastausgleich implementieren und Anfragen auf mehrere verteilenSCGIServer.
Ein weiterer Vorteil besteht darinTCP Sockets erleichtern die Überwachung und das Debuggen auf Netzwerkebene. Mit Standard-Netzwerktools können wir den Kommunikationsstatus einfach überprüfen und Probleme diagnostizieren.
Jedoch,TCPDer Hauptnachteil von Steckdosen besteht darin, dass die Leistung etwas geringer istUnix Domain-Socket. Selbst bei der Kommunikation auf demselben Computer müssen die Daten den gesamten Netzwerkprotokollstapel durchlaufen, was zusätzlichen Overhead mit sich bringt.Zusätzlich verwendenTCPFür Sockets sind möglicherweise zusätzliche Sicherheitsüberlegungen erforderlich, z. B. das Festlegen von Firewall-Regeln oder die VerwendungSSL/TLSVerschlüsselung usw.
Bei der Auswahl der VerwendungUnixDomain-Socket immer nochTCPBei der Verwendung von Steckdosen müssen folgende Faktoren berücksichtigt werden:
Leistungsanforderungen: Wenn Sie die höchste Leistung anstreben undNginxUndSCGIDer Server befindet sich auf demselben Computer und sollte ausgewählt werdenUnixDomain-Socket.
Bereitstellungsarchitektur: ifNginxUndSCGIWenn der Server auf verschiedenen Computern ausgeführt werden muss oder einen Lastausgleich erreichen muss, müssen Sie ihn verwendenTCPSteckdose.
Sicherheitsanforderungen: Wenn Sicherheit im Vordergrund steht und keine maschinenübergreifende Kommunikation erforderlich ist,UnixDomain-Sockets sind möglicherweise die bessere Wahl.
Skalierbarkeit: Wenn davon auszugehen ist, dass dies erforderlich sein könnteSCGIUm einen Server auf mehrere Maschinen zu skalieren, verwenden SieTCPSockets lassen sich leichter schematisieren.
Debugging- und Überwachungsanforderungen: Wenn Sie zum Überwachen und Debuggen Standard-Netzwerktools verwenden müssen,TCPSteckdosen könnten besser geeignet sein.
Zusamenfassend,UnixDomain-Socket undTCP Sockets sind alle gültige Optionen. Ihre Wahl sollte auf Ihren spezifischen Anwendungsanforderungen, Leistungsanforderungen und der Bereitstellungsumgebung basieren.In vielen Fällen, insbesondere wenn hohe Leistungen angestrebt werden undNginxUndSCGIWenn Server auf demselben Computer koexistieren,Unix Domain-Sockets sind möglicherweise die bessere Wahl. Wenn jedoch eine größere Flexibilität oder eine verteilte Bereitstellung erforderlich ist,TCPSteckdosen sind eine unverzichtbare Option.
In diesem Kapitel wird ausführlich darauf eingegangenscgi_pass
Drei wichtige Aspekte der erweiterten Konfiguration: Timeout-Einstellungen, Pufferkonfiguration und Verbindungspoolverwaltung.
Die Timeout-Einstellung soll sicherstellenNginxUndSCGI Schlüssel zur Zuverlässigkeit der Kommunikation zwischen Servern. Eine ordnungsgemäße Timeout-Konfiguration kann verhindern, dass Anfragen bei einem Problem auf unbestimmte Zeit hängen bleiben, und bietet gleichzeitig ausreichend Verarbeitungszeit für langsame Verbindungen.
NginxBietet mehrerescgi_pass
Verwandte Timeout-Anweisungen:
Erstensscgi_connect_timeout
, was definiertNginxUndSCGI Die maximale Wartezeit, die der Server benötigt, um eine Verbindung herzustellen. Wenn die Verbindung nicht innerhalb der angegebenen Zeit hergestellt werden kann,Nginx wird einen Fehler zurückgeben. Zum Beispiel:
scgi_connect_timeout 60s;
Diese Konfiguration legt das Verbindungszeitlimit auf 60 Sekunden fest.
Zweitens,scgi_read_timeout
festgelegtNginxausSCGI Das Timeout des Servers für das Lesen von Antworten.WennSCGI Der Server hat in dieser Zeit keine Daten übertragen und die Verbindung wird geschlossen. Zum Beispiel:
scgi_read_timeout 60s;
zu guter Letzt,scgi_send_timeout
bereits eingerichtetNginxIn RichtungSCGI Der Timeout-Zeitraum für das Senden von Anfragen durch den Server.Wenn innerhalb der angegebenen ZeitSCGI Der Server hat keine Daten empfangen und die Verbindung wird geschlossen. Zum Beispiel:
scgi_send_timeout 60s;
Diese Timeout-Einstellungen sollten basierend auf den Anforderungen der tatsächlichen Anwendung angepasst werden. Für die meisten Anwendungen reichen die Standardwerte aus. Bei einigen Anfragen mit langer Laufzeit kann es jedoch erforderlich sein, diese Zeitüberschreitungswerte zu erhöhen.
Pufferkonfiguration zur OptimierungNginxUndSCGI Die Datenübertragung zwischen Servern ist von entscheidender Bedeutung. Angemessene Puffereinstellungen können die Reaktionsgeschwindigkeit verbessern und den Ressourcenverbrauch reduzieren.
scgi_buffer_size
Anleitung zum Einstellen zum LesenSCGI Die Puffergröße für den ersten Teil der Serverantwort. Dieser enthält normalerweise einen kleinen Antwortheader. Zum Beispiel:
scgi_buffer_size 4k;
scgi_buffers
Anweisungen werden zum Lesen definiertSCGI Die Anzahl und Größe der Puffer für Serverantworten. Zum Beispiel:
scgi_buffers 8 4k;
Diese Konfiguration erstellt 8 Puffer mit einer Größe von 4 KB.
Wenn die Antwort nicht vollständig in den Speicher passt, können Sie sie verwendenscgi_max_temp_file_size
Richtlinie zur Begrenzung der maximalen Größe temporärer Dateien:
scgi_max_temp_file_size 1024m;
Dadurch wird die maximale Größe temporärer Dateien auf 1024 MB begrenzt.
Für große Antworten können Sie verwendenscgi_busy_buffers_size
Anweisung zur Begrenzung der verfügbaren Puffergröße im Auslastungszustand:
scgi_busy_buffers_size 8k;
Diese Puffereinstellungen sollten basierend auf Ihren Anwendungseigenschaften und Serverressourcen optimiert werden, um eine optimale Leistung zu erzielen.
Die Verwaltung des Verbindungspools ist optimiertNginxUndSCGI Ein weiterer wichtiger Aspekt der Kommunikation zwischen Servern. Durch die Wiederverwendung von Verbindungen kann der Aufwand für den Aufbau neuer Verbindungen erheblich reduziert und die Gesamtleistung verbessert werden.
scgi_keepalive
Direktive zur Konfiguration des UpstreamsSCGI Die maximale Anzahl inaktiver Verbindungen, die der Server aufrechterhalten kann. Zum Beispiel:
scgi_keepalive 10;
Diese Konfiguration ermöglicht es jedem Arbeitsprozess, bis zu 10 inaktive Keep-Alive-Verbindungen aufrechtzuerhalten.
Kann benutzenscgi_http_version
Befehl zum AngebenNginxbenutzt mitSCGIServerkommunikationHTTPProtokollversion:
scgi_http_version 1.1;
verwendenHTTP/1.1Es können langlebige Verbindungen aktiviert werden, was für die Aufrechterhaltung der Effizienz des Verbindungspools von entscheidender Bedeutung ist.
Zusätzlich kann man verwendenscgi_next_upstream
Anweisungen zur Steuerung, unter welchen Umständen Anfragen an den nächsten Server weitergeleitet werden sollen:
scgi_next_upstream error timeout invalid_header http_500;
Diese Konfiguration gibt an, was zu tun ist, wenn ein Fehler auftritt, eine Zeitüberschreitung auftritt, ein ungültiger Header empfangen wird oderHTTP Bei einem 500-Fehler sollte die Anfrage an den nächsten Server weitergeleitet werden.
Geschrieben werden
In diesem Artikel wird ausführlich darauf eingegangenNginxMittescgi_pass
Anwendung von Anweisungen, mit besonderem Schwerpunkt aufPython Anwendungskonfiguration und -bereitstellung.Wir haben es zuerst vorgestelltSCGIAnschließend wurden die Eigenschaften und Vorteile des Protokolls ausführlich erläutert.scgi_pass
Grundlegende Syntax und erweiterte Konfigurationsoptionen für Anweisungen.Zeigen Sie anhand praktischer Fälle, wie es gehtPython-FlupRahmenkonfigurationscgi_pass
, einschließlich Grundeinstellungen, Lastausgleich, Verbindungspooling und Pufferverwaltung.