Frage Nginx "Standard" Server? [Duplikat]


Diese Frage hat hier bereits eine Antwort:

Ich habe ein Nginx mit einer Anzahl von aktivierten Serverblöcken. Jeder Server antwortet auf eine kanonische Domain und kann 1 oder mehr an diese kanonische URL weiterleiten. Ich habe mindestens einen Server (habe noch nicht alle überprüft). Wenn ich eine nicht existierende Domain eintippe, die auf diese Box zeigt, zeigt Nginx eine Site ihrer Wahl an (immer dieselbe Site, aber keine Ich bin hinterher).

Ich habe die Konfigurationsdatei für die Seite durchsucht, auf der ich immer gelandet bin, sehe aber nichts offensichtlich das würde es als jede Art von Default-Site identifizieren und doch ist es da, immer wenn ich eine URL fett fange.

Irgendwelche Gedanken darüber, wonach ich suchen sollte, um das aufzuspüren?


22
2017-07-19 17:32


Ursprung




Antworten:


Hinzufügen default_server zu deinem listen Richtlinie in der server dass Sie als Standard fungieren möchten.


21
2017-07-19 17:35



Nun, das ist die Sache. Ich will wirklich keinen Standard, aber ich habe anscheinend einen. Ich würde lieber nginx nur werfen, was Fehler es wirft, wenn was ich tippe stimmt nicht genau etwas. - Rob Wilkerson
@RobWilkerson Sie meinen den Fehler, den es wirft, wenn Sie eine Ressource anfordern, die nicht existiert? Das ist viel anders als ein Hostname, der nicht mit einem Server übereinstimmt, aber Sie können ihn so konfigurieren, dass er den gleichen Effekt erzielt: Erstellen Sie einen Standard-Serverblock mit nichts als dem listen mit default_server, und try_files =404;. - Shane Madden♦
Lass mich die Frage anders stellen. Was bewirkt, dass Nginx Site X lädt, wenn eine nicht passende Domain aufgerufen wird? Warum Site X und nicht Site Y? Warum wirft es nicht einfach einen Fehler? - Rob Wilkerson
@RobWilkerson Es wählt immer einen Standard-Server für jedes IP: Port-Listening-Paar aus und bedient es für alle Anfragen, die nicht mit a übereinstimmen server Block. Ich habe es nicht geschrieben, daher kann ich Ihnen den Grund für dieses Verhalten nicht nennen, aber ich würde sagen, wahrscheinlich weil es viel benutzerfreundlicher und einfacher zu beheben ist als "Ich habe den falschen Inhalt" im Vergleich zu "404? Huh?" . Das gewünschte Verhalten ist sehr einfach zu erreichen. Warum ist das ein Problem? - Shane Madden♦
Ich weiß nicht, dass es ein Problemper se. Ich habe gerade etwas Neues für den Tag gelernt. :-) - Rob Wilkerson


Warum macht Nginx das?

Der Grund dafür ist einfach. Sehr alte oder gebrochene Clients senden die nicht Host HTTP-Header-Feld in ihren Anfragen und wenn Sie Name-basierte Server-Blöcke verwenden (Namen basierte virtuelle Hosts in Apache-Termini) nginx ist nicht in der Lage festzustellen, welcher der Server, die Sie konfiguriert haben, vom Client gemeint ist. Das gleiche Problem gilt für jeden anderen Webserver, der dieses namensbasierte System unterstützt. Dieses Problem tritt nicht auf, wenn Sie für jede Domäne ein IP-basiertes System verwenden (was auch bedeutet, dass Sie mehrere Netzwerkschnittstellen haben).

Mehr zu diesem Thema? Wie verarbeitet nginx eine Anfrage?


Welches ist das erste?

Nginx wählt den Server, der zuerst kommt, wenn nein default Flag wurde auf irgendeinen gesetzt listen Richtlinie:

server {
  server_name server1.com;
}

server {
  server_name server2.com;
}

server1.com wird Standard sein.

Wenn Sie die symbolischen Links automatisch von sites-enabled (Standardkonfiguration) Die Datei, die zuerst im Verzeichnis erscheint, ist Ihr erster Server.


Was kann ich tun, um dies zu verhindern?

Gute Frage und du solltest es verhindern. Es gibt keinen Grund, diese alten Kunden zu unterstützen und absolut keinen Grund, kaputte Clients zu unterstützen. Das Problem lässt sich einfach lösen, indem Sie eine Standard-Catch-Serverkonfiguration erstellen. Das folgende Beispiel stammt aus einem meiner Projekte und zielt auf die aktuelle Version von nginx ab (1.5.2 - sollte aber auch mit älteren Versionen funktionieren):

# /etc/nginx/sites-enabled/_.conf

# Default server for clients who do not send correct Host header.
# The underline in the file name makes sure that this file comes first in the dir.
server {
  server_name _;
  listen *:80 default_server deferred;
  return 444;
}

Konfiguration ist getrimmt, mehr Nginx-Konfiguration Zeug.


29
2017-07-20 20:40



+1 Tolle Infos. Vielen Dank. - Rob Wilkerson
Seien Sie vorsichtig mit zwischengespeicherten 301 Weiterleitungen (im Browser), wenn Sie dies einrichten. Ich habe in Chrome ausgeflippt und nicht verstanden warum ich return 444; funktionierte nicht, bis ich Dev Tools in einem Incognito-Fenster öffnete und erkannte, dass alles gut funktionierte. - jonathanbell
Danke für diese Erklärung @Fleshgrinder, es war eine kreative Lösung, wenn Sie keinen Standardserver unter Ihren realen Servern haben wollen. - Carlos Alberto Martínez Gadea
Wenn also der Standardserver nicht verfügbar ist, kehrt Nginx bei einem "First Match" -Musterverhalten zurück. - Webman