Ich habe mehrere Server auf demselben Computer, einige nur mit http, einige mit http und https. In separaten Dateien sind mehrere Serverblöcke definiert, die in der Hauptkonfigurationsdatei enthalten sind.
Ich habe einen "Standard" -Server für http eingerichtet, der eine allgemeine "Wartungsseite" für Anforderungen bereitstellt, die keinem der anderen Servernamen in den anderen Konfigurationsdateien entsprechen. Der http-Standardserver funktioniert wie erwartet, er verwendet den Servernamen "_" und erscheint zuerst in der Liste der Includes (da ich festgestellt habe, dass bei doppelten Servernamen der zuerst angezeigte verwendet wird). Das funktioniert super.
Ich würde den gleichen genauen Serverblock erwarten (nur das Umschalten von "listen 80 default_server" auf "listen 443 default_server" und auch, anstatt die Seite "return 444" zu bedienen), tut dies jedoch nicht. Stattdessen scheint es, dass der neue Standard-https-Server tatsächlich alle eingehenden https-Verbindungen abruft und dazu führt, dass diese fehlschlagen, obwohl die anderen Serverblöcke geeignetere Servernamen für die eingehenden Anforderungen haben. Durch das Entfernen des neuen Standard-https-Servers wird das halbkorrekte Verhalten fortgesetzt: Die Websites mit https werden alle korrekt geladen. Websites ohne https werden jedoch alle an den ersten https-Server in den Include-Dateien weitergeleitet (wenn laut Dokumentation kein "default_server" angezeigt wird, ist der erste Serverblock "default").
Meine Frage ist also, wie man in nginx einen "Standardserver" für SSL-Verbindungen richtig definiert. Warum ist es so, dass wenn ich explizit einen "default_server" setze, es gierig wird und alle Verbindungen aufbaut, während wenn ich nginx implizit den "default server" bestimmen lasse, funktioniert es wie erwartet (mit dem falschen Server als Standard und den anderen realen Servern) sich richtig verhalten)?
Hier sind meine "Standardserver". HTTP funktioniert, ohne andere Server zu beschädigen. HTTP bricht andere Server und verbraucht alles.
server {
listen 443 ssl default_server;
server_name _;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
return 444;
}
server {
listen *:80 default_server;
server_name _;
charset utf-8;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
root /home/path/to/templates;
location / {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
}
Weiß jemand von euch, was hier falsch sein könnte?
Ich habe es geschafft, mit nginx ein gemeinsames dediziertes Hosting auf einer einzelnen IP zu konfigurieren. Standardmäßiges HTTP und HTTPS, das eine 404 für eingehende unbekannte Domänen bereitstellt.
1 - Erstellen Sie eine Standardzone
Da nginx vhosts in ASCII-Reihenfolge lädt, sollten Sie eine
00-default
Datei / einen symbolischen Link in Ihrem erstellen/etc/nginx/sites-enabled
.2 - Füllen Sie die Standardzone
Füllen Sie Ihre
00-default
mit voreingestellten vhosts. Hier ist die Zone, die ich benutze:3 - Selbstsigniertes Zertifikat erstellen, testen und neu laden
Sie müssen ein selbstsigniertes Zertifikat in erstellen
/etc/nginx/ssl/nginx.crt
.Erstellen Sie ein selbstsigniertes Standardzertifikat:
Nur eine Erinnerung:
nginx -t
sudo service nginx reload
Ich hoffe es hilft.
quelle
default_server
für Listen 443 hinzufügen musste und die IPv6-Adresse [::]: 80 und [::]: 443 mit hinzufügtedefault_server
.Grundsätzlich möchten wir unter allen Umständen vermeiden, dass die erste Serverdefinition in unserer Konfigurationsdatei als Catch-All-Server für SSL-Verbindungen dient. Wir alle wissen, dass dies der Fall ist (im Gegensatz zu http und der Verwendung von default_server config, die gut funktioniert).
Dies kann (noch) nicht deklarativ für SSL erreicht werden, daher müssen wir es mit einer IF codieren ...
Die Variable
$host
ist der Hostname aus der Anforderungszeile oder dem http-Header. Die Variable$server_name
ist der Name des Serverblocks, in dem wir uns gerade befinden.Wenn diese beiden also nicht gleich sind, haben Sie diesen SSL-Serverblock für einen anderen Host bereitgestellt, sodass dieser blockiert werden sollte.
Der Code enthält keine spezifischen Verweise auf Ihre Server-IP-Adressen, sodass er ohne Änderungen problemlos für andere Serverkonfigurationen wiederverwendet werden kann.
Beispiel:
quelle
listen [::]:443 ssl http2;
macht Ich habe Probleme, die Dokumentation dafür zu finden.Um mehr über die Antwort von Radmilla Mustafa zu erfahren:
Nginx verwendet den 'Host'-Header, um den Servernamen abzugleichen. Es wird kein TLS-SNI verwendet. Dies bedeutet, dass nginx für einen SSL-Server eine SSL-Verbindung akzeptieren muss, was darauf hinausläuft, ein Zertifikat / einen Schlüssel zu haben. Das Zertifikat / der Schlüssel kann ein beliebiges sein, z. B. selbst signiert.
Siehe Dokumentation
Die Lösung lautet daher:
quelle
An alle, die darüber so viel Haare verloren haben wie ich (die heute fast den ganzen Tag damit verbracht haben). Ich habe fast alles ausprobiert, und das, was dazu geführt hat, dass es endlich richtig funktioniert, war diese dumme Zeile:
Aufbauend auf der Antwort von Ifnot lautet mein Arbeitsbeispiel:
Ich habe keine Ahnung, warum dies notwendig war, das einzige Prinzip, das ich daraus ableitete, war, dass Nginx sich sehr seltsam verhält, wenn wir ihm nicht geben, was er will.
quelle
Wenn Sie absolut sicher sein möchten, verwenden Sie separate IP-Adressen für Hosts, die nicht auf HTTPS antworten sollen, und für Hosts, die nicht antworten sollen. Dies behebt auch das Problem der Browserwarnung "Ungültiges Zertifikat".
quelle