Technologieaustausch

Nginx-Reverse-Proxy mit sieben Schichten (Anwendungsschicht): SCGI-Proxy scgi_pass

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Nginx-Reverse-Proxy mit sieben Schichten (Anwendungsschicht).
SCGI-Agent scgi_pass

- Artikelinformationen -
Autor: Li Juncai (jcLee95)
Besuchen Sie mich bei CSDN: https://jclee95.blog.csdn.net
Meine Webseitehttp://thispage.tech/
Email: [email protected].
Shenzhen, China (ots/PRNewswire)
Adresse dieses Artikels:https://blog.csdn.net/qq_28550263/article/details/140253307
Huawei:https://bbs.huaweicloud.com/blogs/XXXXXXXXXX

[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.


In Verbindung stehende Artikel:
Siebenschichtiger Nginx-Reverse-Proxy: HTTP-Reverse-Proxy-Proxy_Pass

Siebenschichtiger Nginx-Reverse-Proxy: UWSGI-Proxy uwsgi_pass
Siebenschichtiger Nginx-Reverse-Proxy: SCGI-Proxy scgi_pass
Siebenschichtiger Nginx-Reverse-Proxy: FastCGI-Proxy fastcgi_pass

Fügen Sie hier eine Bildbeschreibung ein


1. Übersicht

1.1 Was ist SCGI?

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.

1.2 Anwendungsszenarien von SCGI

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:

  1. 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.

  2. Lang laufende Prozesse: Bestimmte Anwendungen, die ihren Zustand aufrechterhalten müssen oder lange laufen, können dies tunSCGIUndNetzDer Server unterhält eine dauerhafte Verbindung.

  3. Sprachspezifische Optimierungen: Bestimmte Programmiersprachen oder Frameworks können verwendet werdenSCGIzeigen eine bessere Leistung oder eine einfachere Implementierung.

Von inNginxbenutzt inscgi_passBefehl 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.

2. Einführung in das SCGI-Protokoll

2.1 Eigenschaften des SCGI-Protokolls

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.

2.2 SCGI vs. HTTP-Protokoll

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.

2.3 SCGI vs. FastCGI

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.

  1. 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.

  2. Aufnahmetyp:FastCGIEs sind mehrere Datensatztypen definiert (z. B.STDINSTDOUTSTDERRusw.), 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.

  3. 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.

  4. 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.

3. scgi_pass-Direktive in Nginx

3.1 Grundlegende Syntax der scgi_pass-Anweisung

existierenNginxKonfigurieren,scgi_passDie 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_passDie grundlegende Syntax des Befehls lautet wie folgt:

scgi_pass address;
  • 1

In,addressEs kann in folgenden Formen vorliegen:

  1. Domainname bzwIPAdresse plus Portnummer:

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.

  1. UnixDomain-Socket-Pfad:

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.

  1. Name der Upstream-Servergruppe:

Zum Beispiel:scgi_pass scgi_backend;

In dieser Verwendungscgi_backendist einer inNginx Eine vordefinierte Upstream-Servergruppe in der Konfigurationsdatei. Dadurch können Sie erweiterte Funktionen wie Lastausgleich und Failover implementieren.

scgi_passAnweisungen liegen normalerweise vorlocationWird in Blöcken verwendet, um bestimmte Dinge zu behandelnURL Weg. Zum Beispiel:

location /scgi/ {
    scgi_pass localhost:9000;
    include scgi_params;
}
  • 1
  • 2
  • 3
  • 4

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_passRichtlinien können mit anderen kombiniert werdenNginx Direktiven werden in Kombination verwendet, um komplexere Konfigurationen zu erreichen.Sie können zum Beispiel verwendenifBedingte 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

In diesem Beispiel,POSTAnfragen werden an Port 9001 weitergeleitet, während alle anderen Anfragen an Port 9000 weitergeleitet werden.

3.2 scgi_pass vs. proxy_pass

scgi_passUndproxy_passEs handelt sich bei allen um häufig verwendete Reverse-Proxy-Anweisungen, die alle Anforderungen an den Backend-Server weiterleiten.

In,scgi_passKonzipiert 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_passist eine allgemeinere Direktive, die als Proxy für eine Vielzahl von Protokollen verwendet werden kann, darunterHTTPHTTPSFastCGIWarten.

In Benutzungscgi_passStunde,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_passEs wird normalerweise verwendet, um die Anfrage ohne Protokollkonvertierung unversehrt an den Backend-Server weiterzuleiten.

Ein weiterer wichtiger Unterschied besteht in der Konfiguration.scgi_passErfordert normalerweise Kooperationscgi_paramDirektive, 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5

In diesem Beispiel,include scgi_paramsvordefiniert eingeführtSCGIParameter, währendscgi_paramDirektiven werden verwendet, um zusätzliche Parameter festzulegen.

Im Gegensatz,proxy_passDie Konfiguration ist in der Regel einfacher und unkomplizierter:

location /api/ {
    proxy_pass http://backend_server;
}
  • 1
  • 2
  • 3

Was die Leistung angeht,scgi_passUndproxy_pass Jedes hat seine eigenen Vorteile.Speziell für den Einsatz konzipiertSCGIProtokollanwendung,scgi_passkann eine bessere Leistung bieten, weil es vermeidetHTTP Protokoll-Overhead. Jedoch,proxy_passSeine Vielseitigkeit macht es flexibler und kann an verschiedene Backend-Server und Protokolle angepasst werden.

Auch die Sicherheit ist ein zu berücksichtigender Aspekt.Weilscgi_passgewidmetSCGI Protokoll, das in manchen Fällen eine bessere Sicherheit bieten kann, da es die Kommunikation mit dem Backend-Server einschränkt.Undproxy_passAufgrund 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_passTrotzdemproxy_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_passkönnte passender sein.

3.3 Wie scgi_pass funktioniert

scgi_passDie 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_passder 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_paramZusä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,
  • 1

In diesem Beispiel stellt „70“ die Gesamtlänge des Headers dar, gefolgt von drei Schlüssel-Wert-Paaren:CONTENT_LENGTHSCGIUndREQUEST_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ückgesendetNginxSCGIDas 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.

4. Konfigurieren Sie Nginx für die Verwendung von scgi_pass

4.1 Beispiel für eine Grundkonfiguration

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.confoder/usr/local/nginx/conf/nginx.conf .In dieser Datei müssen wirhttpInnerhalb eines Blocks hinzufügen oder ändernserverStück.

existierenserverBlock, 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;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

In dieser Konfigurationlisten 80Anweisungen sagenNginxHören Sie auf Port 80 (Standard).HTTPHafen).server_nameDie 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_passBefehl 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_paramsoder/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_FILENAMEParameter 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5

Hier,SCRIPT_FILENAMEDer Parameter wird auf den tatsächlichen Pfad zum Skript gesetzt.$fastcgi_script_nameIst 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;
}
  • 1
  • 2
  • 3
  • 4

In diesem Beispiel,Nginxwird über lokalisiert/tmp/scgi.socketvonUnixDomain-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
  • 1

oder

sudo systemctl restart nginx
  • 1

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.

4.2 Verwendung des Upstream-Moduls

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_passDas 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;
    # 更多服务器...
}
  • 1
  • 2
  • 3
  • 4
  • 5

In dieser Konfigurationbackend_nameist der Name, den Sie für diese Servergruppe angegeben haben und der später verwendet werden kannscgi_pass in der Richtlinie zitiert.jedeserverDie 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_serversUpstream-Gruppe:

upstream scgi_servers {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
    server unix:/tmp/scgi.socket;
}
  • 1
  • 2
  • 3
  • 4
  • 5

Nachdem wir Upstream definiert haben, können wirscgi_passVerwenden Sie es in der Direktive:

location /app/ {
    scgi_pass scgi_servers;
    include scgi_params;
}
  • 1
  • 2
  • 3
  • 4

Also,NginxDie Anfrage wird weitergeleitet anscgi_serversServer in der Gruppe.

Das Upstream-Modul bietet eine Vielzahl von Lastausgleichsalgorithmen, die durch Hinzufügen von Parametern nach der Serveranweisung konfiguriert werden können:

  1. Round-Robin (Standard): Verteilen Sie Anforderungen nacheinander an jeden Server.

  2. 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;
}
  • 1
  • 2
  • 3
  • 4
  1. Geringste Verbindungen: Senden Sie die Anfrage an den Server mit der geringsten Anzahl aktuell aktiver Verbindungen.verwendenleast_connAnweisung:
upstream scgi_servers {
    least_conn;
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  1. IPHash: laut KundeIPDer Hashwert der Adresse zur Auswahl des Servers kann sicherstellen, dass sie von demselben stammtIP Anfragen werden immer an denselben Server gesendet (es sei denn, dieser Server ist nicht verfügbar).verwendenip_hashAnweisung:
upstream scgi_servers {
    ip_hash;
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}
  • 1
  • 2
  • 3
  • 4
  • 5

Das Upstream-Modul bietet außerdem Serverzustandsprüfung und Failover-Funktionalität.Zum Beispiel können wir verwendenmax_failsUndfail_timeoutParameter 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;
}
  • 1
  • 2
  • 3
  • 4

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 verwendenbackupParameter 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5

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.

4.3 Unix-Socket vs. TCP-Socket

In der KonfigurationNginxvonscgi_passDirektive 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;
  • 1

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;
  • 1

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:

  1. Leistungsanforderungen: Wenn Sie die höchste Leistung anstreben undNginxUndSCGIDer Server befindet sich auf demselben Computer und sollte ausgewählt werdenUnixDomain-Socket.

  2. Bereitstellungsarchitektur: ifNginxUndSCGIWenn der Server auf verschiedenen Computern ausgeführt werden muss oder einen Lastausgleich erreichen muss, müssen Sie ihn verwendenTCPSteckdose.

  3. Sicherheitsanforderungen: Wenn Sicherheit im Vordergrund steht und keine maschinenübergreifende Kommunikation erforderlich ist,UnixDomain-Sockets sind möglicherweise die bessere Wahl.

  4. Skalierbarkeit: Wenn davon auszugehen ist, dass dies erforderlich sein könnteSCGIUm einen Server auf mehrere Maschinen zu skalieren, verwenden SieTCPSockets lassen sich leichter schematisieren.

  5. 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.

5. Erweiterte Konfiguration von scgi_pass

In diesem Kapitel wird ausführlich darauf eingegangenscgi_passDrei wichtige Aspekte der erweiterten Konfiguration: Timeout-Einstellungen, Pufferkonfiguration und Verbindungspoolverwaltung.

5.1 Timeout-Einstellung

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_passVerwandte 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;
  • 1

Diese Konfiguration legt das Verbindungszeitlimit auf 60 Sekunden fest.

Zweitens,scgi_read_timeoutfestgelegtNginxausSCGI 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;
  • 1

zu guter Letzt,scgi_send_timeoutbereits 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;
  • 1

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.

5.2 Pufferkonfiguration

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_sizeAnleitung 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;
  • 1

scgi_buffersAnweisungen werden zum Lesen definiertSCGI Die Anzahl und Größe der Puffer für Serverantworten. Zum Beispiel:

scgi_buffers 8 4k;
  • 1

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_sizeRichtlinie zur Begrenzung der maximalen Größe temporärer Dateien:

scgi_max_temp_file_size 1024m;
  • 1

Dadurch wird die maximale Größe temporärer Dateien auf 1024 MB begrenzt.

Für große Antworten können Sie verwendenscgi_busy_buffers_sizeAnweisung zur Begrenzung der verfügbaren Puffergröße im Auslastungszustand:

scgi_busy_buffers_size 8k;
  • 1

Diese Puffereinstellungen sollten basierend auf Ihren Anwendungseigenschaften und Serverressourcen optimiert werden, um eine optimale Leistung zu erzielen.

5.3 Verbindungspoolverwaltung

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_keepaliveDirektive zur Konfiguration des UpstreamsSCGI Die maximale Anzahl inaktiver Verbindungen, die der Server aufrechterhalten kann. Zum Beispiel:

scgi_keepalive 10;
  • 1

Diese Konfiguration ermöglicht es jedem Arbeitsprozess, bis zu 10 inaktive Keep-Alive-Verbindungen aufrechtzuerhalten.

Kann benutzenscgi_http_versionBefehl zum AngebenNginxbenutzt mitSCGIServerkommunikationHTTPProtokollversion:

scgi_http_version 1.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_upstreamAnweisungen zur Steuerung, unter welchen Umständen Anfragen an den nächsten Server weitergeleitet werden sollen:

scgi_next_upstream error timeout invalid_header http_500;
  • 1

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.

6. Fall einer Python-Flup-Webbereitstellung

Geschrieben werden

6.1 Zusammenfassung der Schritte

6.2 Containerisierte Bereitstellung

7. Zusammenfassung

In diesem Artikel wird ausführlich darauf eingegangenNginxMittescgi_passAnwendung 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.