Lösen Sie das Problem, dass Nginx nach der Konfiguration von proxy_pass 404 zurückgibt

Lösen Sie das Problem, dass Nginx nach der Konfiguration von proxy_pass 404 zurückgibt

1. Fehlerbehebung und Lokalisierung des Problems, dass Nginx nach der Konfiguration von proxy_pass 404 zurückgibt

1.1. Problem

In einer Produktionskonfiguration mit mehreren Weiterleitungen besteht die Anforderung aus dem folgenden Diagramm:
Nach der Konfiguration von proxy_pass gibt die Anforderung von www.djx.com ohne weitere Ausnahmen direkt 404 zurück. Wenn wir jedoch das Backend www.baidu.com direkt anfordern, reagiert es normal. Das ist sehr merkwürdig. Laut Protokoll wird die Anfrage auch an www.baidu.com weitergeleitet. Die Anforderungsantwort ist jedoch 404.

1.2. Finden Sie die Ursache des Problems

Unsere Standardkonfiguration von Nginx proxy_set_header ist

Proxy_Set_Header Host $host;
  • Server: 192.168.2.189
  • Server 1: 192.168.1.180 Nginx1
  • Server 2: 192.168.1.90 Nginx2

Wenn wir diese Einstellung verwenden, wenn die erste Schicht von Nginx (Nginx1) als Proxy fungiert, lautet der von uns angeforderte Domänenname www.djx.com und der aus dem Header dieser Anforderung erhaltene Hostwert lautet www.djx.com . Wir konfigurieren

Proxy_Set_Header Host $host;

Der Hostwert wird auf den weitergeleiteten Hostwert gesetzt, aber der angeforderte Domänenname lautet www.baidu.com , d. h. das Hostfeld im Header lautet www.djx.com. Dies wird durch die Inkonsistenz zwischen dem angeforderten Domänennamen und dem Host im Header verursacht.

1.3. offizielle Informationen zu proxy_set_header

Offizielle Dokumentation

Die Standardeinstellung ist

Proxy_Set_Header Host $Proxy_Host;
proxy_set_header Verbindung schließen;

1.4 Lösung

Der Wert von Host wird auf $proxy_host gesetzt. Weitere Informationen zum Wert von $proxy_host finden Sie in der folgenden Erweiterung.

Proxy_Set_Header Host $Proxy_Host;

2. Erweiterung gängiger Konfigurationen

1. $proxy_host

Proxy_Set_Header Host $Proxy_Host; 
#Standardkonfiguration# Wie der Name schon sagt, wird der Anforderungsheader auf den Domänennamen hinter dem Proxy gesetzt.

Beispiel 1:
Wenn wir Upstream konfigurieren, ist der Wert von $proxy_host der Name des Upstreams.

Upstream open-hz8443{
Server 10.60.6.184:8000 max_fails=1 fail_timeout=3s Gewicht=10;
}

Dann ist der Wert von $proxy_host hier open-hz8443.

Beispiel 2:
Wenn wir Upstream nicht konfigurieren, ist der Wert von $proxy_host die IP-Adresse und der Port nach proxy_pass . 10.60.6.184:8000 . Wenn proxy_pass http://www.djx.com:8000; dann ist der Wert von $proxy_host www.djx.com:8000 .

Standort ^~ /wss/v1
{
 Proxy-Passwort http://10.60.6.184:8000;
 Proxy_Set_Header Host $Proxy_Host;
 proxy_set_header Verbindung "Upgrade";
 Proxy_Set_Header-Upgrade $http_upgrade;
 tcp_nodelay ein; 
 
}

2. $host

Proxy_Set_Header Host $host;
# Wenn das Feld nicht im Anforderungsheader enthalten ist, kann es nicht übergeben werden. In diesem Fall können Sie den Wert der Host-Variable zuweisen, indem Sie die Host-Variable festlegen.

Wenn im Anforderungsheader kein Host-Wert vorhanden ist, wird der Wert von Servername direkt zum Auffüllen verwendet.

Wenn der Host-Wert im Anforderungsheader empfangen wird, wird der Host-Wert im Anforderungsheader direkt verwendet.

3. $host:$proxy_port

Proxy_Set_Header Host $host:$Proxy_Port;

# Der Servername und der Port werden zusammen über den Proxyserver weitergegeben. Im Vergleich zum vorherigen Punkt gibt es einen zusätzlichen $proxy_port. Dieser $proxy_port ist der Port in proxy_pass. Wenn kein Port vorhanden ist, z. B. 80 und 443. Es wird auch eine Füllung 80/443 verwendet. 

Beispiel: 
Proxy-Passwort http://www.baidu.com;

$host:$proxy_port = Baidu ip:80

4. $http_host

Proxy_set_header Host $http_host; 
# Ein sich nicht änderndes Anforderungsheaderfeld „Host“ kann wie folgt übergeben werden:

Wenn im Anforderungsheader kein Host-Wert vorhanden ist, wird der Wert von Servername direkt zum Auffüllen verwendet. Und fügen Sie den Port hinzu. Wenn der Wert 80/443 beträgt, fügen Sie ihn nicht hinzu. Tatsächlich geht es darum, den Wert in der URL anzufordern. http://server:port/v1

Wenn der Host-Wert im Anforderungsheader empfangen wird, wird der Host-Wert im Anforderungsheader direkt verwendet.

Beispiel

  • Server: 192.168.2.189
  • Server 1: 192.168.1.180 Nginx1
  • Server 2: 192.168.1.90 Nginx2

Grundkonfiguration
192.168.1.180 Nginx1

Server{
 hören Sie 80;
 Servername www.djx.com;
 
 Standort / {
  Proxy-Passwort http://www.baidu.com/;
 }
 
}

192.168.1.190 Nginx2

Server{
 hören Sie 80;
 Servername www.baidu.com;
 
 Standort / {
  Proxy-Passwort http://192.168.1.80:8080/;
 }
 
}

** Grundlegende Konfiguration verwenden **
Das heißt

Proxy_Set_Header Host $Proxy_Host;

Dann ist der Wert des Headers zu http://192.168.1.80:8080/ www.baidu.com.

** $host wird verwendet **
Das heißt

Proxy_Set_Header Host $host;

Referenzartikel: https://cloud.tencent.com/developer/article/1557504

Dies ist das Ende dieses Artikels über den 404-Fehler nach der Nginx-Konfiguration von Proxy_Pass. Weitere relevante Inhalte zur Nginx-Konfiguration von Proxy_Pass finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Mechanismus und der Implementierung der Accept-Sperre in Nginx
  • Lösung für den Konfigurationsfehler des Nginx-SSL-Zertifikats
  • Ursachen und Lösungen für den Nginx 502 Bad Gateway-Fehler
  • Proxy_pass-Methode in mehreren if in Nginx-Standorten
  • Beispielcode für die Nginx-Konfiguration zum Herunterladen von Dateien
  • Implementierung mehrerer Nginx-Standorte, die alle Anfragen weiterleiten oder auf statische Ressourcendateien zugreifen
  • So zeigen Sie den Nginx-Konfigurationsdateipfad und den Ressourcendateipfad an
  • Detaillierte Erläuterung der Implementierung der Nginx-Prozesssperre

<<:  HTML-Formular-Tag-Tutorial (5): Textfeld-Tag

>>:  Praktisches Tutorial zum Ändern des MySQL-Zeichensatzes

Artikel empfehlen

CSS-Beispielcode zur Implementierung von Schiebetüren

Durch die sogenannte Sliding Door-Technologie läs...

Verwenden von CSS3 zum Implementieren eines Schriftfarbverlaufs

Beim Verwenden von Animation.css habe ich festges...

Vue-Statusverwaltung: Verwendung von Pinia statt Vuex

Inhaltsverzeichnis 1. Was ist Pinia? 2. Pinia ist...

Eine kurze Analyse des Unterschieds zwischen ref und toRef in Vue3

1. ref wird kopiert, die Ansicht wird aktualisier...

Installationstutorial auf Unternehmensebene unter Verwendung des LAMP-Quellcodes

Inhaltsverzeichnis LAMP-Architektur 1.Lampeneinfü...

Informationen zu WSL-Konfigurations- und Änderungsproblemen in Docker

https://docs.microsoft.com/en-us/windows/wsl/wsl-...

So verwenden Sie CURRENT_TIMESTAMP in MySQL

Inhaltsverzeichnis Verwendung von CURRENT_TIMESTA...

MySQL-Abfrage redundanter Indizes und ungenutzter Indexoperationen

MySQL 5.7 und höhere Versionen ermöglichen die di...

Implementierung eines einfachen Rechners mit Javascript

In diesem Artikelbeispiel wird der spezifische Ja...

Lösung für Überlauf: versteckter Fehler in CSS

Ursache des Fehlers Als ich heute ein Karussell s...

Docker-Dateispeicherpfad, Port-Mapping-Betriebsmodus ändern

So erhalten Sie den Container-Startbefehl Der Con...