Tiefgreifendes Verständnis der Matching-Logik von Server und Standort in Nginx

Tiefgreifendes Verständnis der Matching-Logik von Server und Standort in Nginx

Server-Abgleichlogik

Wenn Nginx entscheidet, in welchem ​​Serverblock eine Anforderung ausgeführt werden soll, konzentriert es sich auf die Felder „Listen“ und „Servername“ im Serverblock.

Die Listen-Direktive

Das Listenfeld definiert die IP und den Port, auf die der Server antwortet. Wenn das Listenfeld nicht explizit konfiguriert ist, ist der Standardlistener 0.0.0.0:80 (Root) oder 0.0.0.0:8080 (Nicht-Root).

listen kann wie folgt konfiguriert werden:

  1. Eine Kombination aus einer IP und einem Port
  2. Eine einzelne IP, die standardmäßig auf Port 80 lauscht
  3. Ein einziger Port, der standardmäßig auf allen IP-Schnittstellen lauscht
  4. Ein Unix-Socket-Pfad

Letzteres wird normalerweise nur zum Übertragen von Anfragen zwischen verschiedenen Servern verwendet.

Für die Auswahl des zu verwendenden Servers gelten die folgenden Regeln:

  1. Nginx konvertiert zunächst alle „unvollständigen“ Listenanweisungen, beispielsweise werden solche ohne Listenfeld in „Listen 0.0.0.0:80“ konvertiert, „Listen 1.1.1.1“ wird in „Listen 1.1.1.1:80“ konvertiert usw.
  2. Nginx erstellt eine Liste von Serverblöcken, die der Anfrage basierend auf der angeforderten IP und dem angeforderten Port am besten entsprechen. Dabei werden Serverblöcke, die eine bestimmte IP angeben, bevorzugt und dann Serverblöcke wie „listen 0.0.0.0“ ausgewählt. In beiden Fällen muss der Port exakt übereinstimmen.
  3. Wenn nur eine beste Übereinstimmung vorhanden ist, wird der passende Serverblock zum Beantworten der Anforderung verwendet. Andernfalls wird die Servername-Direktive jedes Serverblocks ausgewertet.

Auch hier wird die Direktive „server_name“ nur ausgewertet, wenn die Direktive „listen“ keine optimale Übereinstimmung finden kann.

Nehmen wir beispielsweise an, dass die Domäne example.com auf 192.168.0.1 verweist und dass nginx auf 192.168.0.1 nur die folgenden beiden Serverblöcke hat:

# Serverblock 1Server {
  hören Sie 192.168.0.1;
  Servername other.com
  ...
}

# Serverblock 2Server {
  hören Sie 80;
  Servername example.com
  ...
}

Server_name-Direktive

Wenn die beste Übereinstimmung gemäß der Listen-Direktive nicht gefunden werden kann, wird die Server_Name-Direktive analysiert. Nginx überprüft den Header „Host“ in der Anfrage. Dieser Wert enthält den Domänennamen oder die IP-Adresse, die der Client tatsächlich anzufordern versucht. Nginx gleicht die Server_Name-Direktive anhand dieses Wertes ab. Die Übereinstimmungsregeln lauten wie folgt:

  1. Nginx versucht, einen Serverblock zu finden, der genau mit den Werten für Servername und Host übereinstimmt. Wenn mehrere genaue Übereinstimmungen gefunden werden, wird der erste übereinstimmende Serverblock verwendet.
  2. Wenn kein exakt passender Serverblock gefunden wird, versucht nginx, einen Serverblock zu finden, dessen Servername mit * beginnt. Wenn mehrere Serverblöcke gefunden werden, wird der am längsten passende Serverblock ausgewählt.
  3. Wenn kein Serverblock gefunden wird, der mit beginnt, wird nach einem Serverblock gesucht, der mit endet. Auch hier wird bei mehreren Übereinstimmungen die längste Übereinstimmung ausgewählt.
  4. Wenn kein Serverblock mit der Übereinstimmung * gefunden wird, wird nach einem Serverblock gesucht, der server_name mit einem regulären Ausdruck (beginnend mit ~) definiert. Wenn mehrere Übereinstimmungen gefunden werden, wird die erste Übereinstimmung verwendet.
  5. Wenn kein Serverblock gefunden wird, der dem regulären Ausdruck entspricht, wählt nginx einen Standardserverblock aus, der dem Listenfeld entspricht. Jede IP- und Portkombination kann mit genau einem Standard-Standardserverblock konfiguriert werden. Wenn es keinen gibt, wird der erste Server in der verfügbaren Liste ausgewählt (die Auswahl erfolgt derzeit zufällig und die Reihenfolge ist nicht festgelegt).

Hier ist ein Beispiel:

(1) Genaue Übereinstimmung mit dem Servernamen, zum Beispiel:

Server {
   hören Sie 80;
   Servername www.domain.com;
   ...
}

(2) Eine Zeichenfolge, die mit dem Platzhalterzeichen * beginnt:

Server {
   hören Sie 80;
   Servername *.Domäne.com;
   ...
}

(3) Eine Zeichenfolge, die mit dem Platzhalterzeichen * endet:

Server {
   hören Sie 80;
   Servername www.*;
   ...
}

(4) Passende reguläre Ausdrücke:

Server {
   hören Sie 80;
   Servername ~^(?.+)\.Domäne\.com$;
   ...
}

(5) Wenn keine der oben genannten Angaben übereinstimmt, wird der Standardserver verwendet. Wenn kein Standardserver angegeben ist, wird der erste verfügbare Server ausgewählt. Wir können angeben, dass ein Fehler an den Client zurückgegeben wird, wenn kein übereinstimmender Hostwert vorhanden ist. Dies kann verwendet werden, um zu verhindern, dass andere Junk-Verkehr auf Ihre Website umleiten.

Server {
  hören Sie 80 Standardserver;
  Servername _; Rückgabewert 444;
}

Lassen Sie nginx die Verbindung zum Browser trennen, indem Sie 444 zurückgeben, einen nicht standardmäßigen Fehlercode von nginx

Standortabgleichslogik

Standortsyntaxanalyse

Standort optionaler Modifikator Standortübereinstimmung {
  ...
}

Die verfügbaren Modifikatoren sind wie folgt

Entscheidungsregeln

1. Nginx sucht zunächst nach präfixbasierten Standortübereinstimmungen (d. h. Übereinstimmungen, die keine regulären Ausdrücke enthalten).

2. Wenn ein Standortblock mit dem Modifikator „=“ vollständig mit der angeforderten URL übereinstimmt, wird der Standort sofort verwendet, um auf die Anforderung zu antworten.

3. Wenn keine Übereinstimmung im Standortblock mit dem Modifikator „=“ gefunden wird, wird das ungenaue Präfix weiter berechnet, das längste übereinstimmende Präfix wird gemäß der angegebenen URI gefunden und dann die folgende Verarbeitung ausgeführt:

(1) Wenn der längste übereinstimmende Ort den Modifikator ^~ hat, verwendet nginx diesen Ort sofort, um auf die Anfrage zu antworten

(2) Wenn der längste übereinstimmende Ort nicht den Modifikator ^~ hat, speichert nginx den Treffer vorübergehend und fährt dann mit dem nächsten Treffer fort.

4. Nachdem der längste passende Präfix-Standortblock ermittelt und gespeichert wurde, prüft nginx weiterhin den passenden Standort des regulären Ausdrucks (Groß-/Kleinschreibung beachten/nicht beachten). Wenn ein regulärer Ausdruck vorhanden ist, der die Anforderungen erfüllt, wird der erste reguläre Ausdrucksstandort, der mit der angeforderten URI übereinstimmt, ausgewählt, um auf die Anforderung zu antworten.

5. Wenn kein mit der angeforderten URI übereinstimmender regulärer Ausdrucksort gefunden wird, wird der zuvor gespeicherte längste Präfixort verwendet, um auf die Anforderung zu antworten.

Auffüllen

Sobald ein Standort zur Beantwortung einer Anfrage ausgewählt wurde, wird die Anfrage normalerweise an diesem Standort bearbeitet, unabhängig von anderen Standorten. Einige Anweisungen am Standort lösen jedoch eine neue Standortübereinstimmung aus, beispielsweise:

(1) Versuch_Dateien

(2) umschreiben

(3) Fehlerseite

Weitere Informationen zum Konfigurieren des Standardservers für https finden Sie unter Richtiges Einrichten eines „Standard“-Nginx-Servers für https.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Verstehen Sie die Implementierung des Nginx-Standortabgleichs in einem Artikel
  • Eine kurze Analyse der Übereinstimmungspriorität des Nginx-Konfigurationsspeicherorts
  • Detaillierte Erläuterung der Nginx-Standortkonfiguration (Standortübereinstimmungsreihenfolge)
  • Detaillierte Erklärung der Standort- und Umschreibenutzung in nginx
  • Erläuterung der Regeln zum Standortabgleich für die Nginx-Konfiguration (Beispiel)

<<:  Vue.js-Textfeld mit Dropdown-Komponente

>>:  Detailliertes Beispiel zum Erstellen und Löschen von Tabellen in MySQL

Artikel empfehlen

So ändern Sie in Nginx die über http aufgerufene Website in https

Inhaltsverzeichnis 1. Hintergrund 2. Voraussetzun...

Beinhaltet der %-Wert im neu erstellten MySQL-Benutzer localhost?

Normale Erklärung % bedeutet, dass jeder Client e...

Die Implementierung der Ereignisbindung in React verweist auf drei Methoden

1. Pfeilfunktion 1. Nutzen Sie die Tatsache, dass...

So stellen Sie Confluence und Jira-Software in Docker bereit

Version: centos==7.2 jdk==1.8 Zusammenfluss == 6....

HTML-Elemente durch Anzeige oder Sichtbarkeit verbergen

Manchmal müssen wir steuern, ob HTML-Elemente auf ...

Was ist die Datei mysql-bin.000001 in MySQL? Kann sie gelöscht werden?

Nachdem ich MySQL über Ports installiert hatte, s...

Eine kurze Diskussion darüber, ob CSS-Animationen durch JS blockiert werden

Der Animationsteil von CSS wird von JS blockiert,...

Ausführliche Erläuterung des globalen Status des WeChat-Applets

Vorwort Im WeChat-Applet können Sie globalData vo...

Detaillierte Schritte zur Entwicklung von WeChat-Miniprogrammen mit Typescript

Auf die Vorteile von Typescript müssen wir nicht ...

MySQL Deep Paging (wie man schnell Millionen von Daten paginiert)

Inhaltsverzeichnis Vorwort Fall Optimierung Zusam...

js implementiert ein einfaches Warenkorbmodul

In diesem Artikelbeispiel wird der spezifische Co...

Zusammenfassung der Fallstricke bei Virtualbox Centos7 NAT+Host-Only-Netzwerken

Inhaltsverzeichnis 1. Problemhintergrund 2. Welch...

Beispielcode zur einfachen Implementierung des Seitenlayouts mit Flex-Layout

Kommen wir ohne weitere Umschweife direkt zum Cod...