Frage nginx HTTPS, das mit der gleichen Konfiguration wie HTTP ausgeliefert wird


Gibt es eine Möglichkeit, Konfigurationsdirektiven über zwei Nginx zu teilen server {} Blöcke? Ich möchte vermeiden, die Regeln zu duplizieren, da der HTTPS- und der HTTP-Inhalt meiner Website mit genau der gleichen Konfiguration geliefert werden.

Momentan ist es so:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

Kann ich etwas tun in der Art von:

server {
  listen 80, 443;
  ...

  if(port == 443) {
    ssl on; #etc
  }
}

174
2018-05-21 16:18


Ursprung




Antworten:


Sie können dies in einem Serverblock wie folgt kombinieren:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Offizielles How-To


238
2018-05-21 18:54



Ah, ich hatte keine Ahnung, dass nginx intelligent genug ist, um die SSL-Anweisungen zu ignorieren, wenn sie über Port 80 geladen werden. - ceejayoz
Nginx ist alle Arten von WIN. - Jauder Ho
und wenn Sie mehrere Seiten auf einem Server haben, ist es erwähnenswert, dass "Standard" nicht obligatorisch ist - luchaninov
So elegant tut es weh ... - Alix Axel
funktioniert hier nicht ... "Die einfache HTTP-Anfrage wurde an den HTTPS-Port gesendet" - gcstr


Um die akzeptierte Antwort zu klären, müssen Sie weglassen

SSL on;

und Sie brauchen nur die folgende Version für nginx nach 0.8.21

listen 443 ssl;

Referenz:

Nginx Docs - Konfigurieren eines einzelnen HTTP / HTTPS-Servers


81
2018-06-13 06:19



Vielen Dank! Ich konnte nicht herausfinden, warum nichts auf http funktionierte. Entfernen von SSL an; hat funktioniert. - Chris Cummings


Ich kenne keinen Weg wie du es vorschlägst, aber es gibt sicherlich einen einfachen und haltbaren Weg.

Verschieben Sie die allgemeinen Servereinstellungen in eine separate Datei, d. H. "ServerFoo.conf" und dann include es ist getrennt server {} Blöcke wie folgt:

server {
    listen 80;
    include serverFoo.conf;
}
server {
    listen 443 ssl;
    include serverFoo.conf;
}

25
2018-05-21 18:38



+1 = funktioniert für mich. (Konnte es nicht mit der anderen Methode arbeiten.) - lackey
Das andere Beispiel berücksichtigt nicht "proxy_pass", wenn es als Load Balancer fungiert. - Mike Purcell
Diese Option ist großartig, wenn Sie server_name ist für jeden Port anders - iDev247
Verwenden Sie nicht SSL, verwenden Sie listen 443 ssl; von jetzt an. - danger89
Dies scheint die einzige Lösung zu sein, die mit dem neuesten nginx 1.10.1 arbeitet. Aus irgendeinem Grund zwei listen Zeilen werden nicht korrekt interpretiert, sondern verschoben, um sie zu trennen server{} behebt es. - Artur Bodera


Erweitern Sie die bereits vorhandenen Antworten, hier ein vollständigeres Beispiel:

server {

    # Listen on port 80 and 443
    # on both IPv4 and IPv6
    listen 80;
    listen [::]:80 ipv6only=on;
    listen 443 ssl;
    listen [::]:443 ipv6only=on ssl;

    # Set website folder
    root /path/to/your/website;

    # Enable SSL
    ssl_certificate your-cert.pem;
    ssl_certificate_key your-cert.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;
}

7
2018-05-10 17:48



Ich weiß, das ist eine ziemlich alte Antwort, aber da es sehr komplett ist, wollte ich nur darauf hinweisen, dass andere, die es verwenden, das SSLv3-Protokoll als anfällig für die POODLE-Schwachstelle deaktivieren sollten: disableßl3.com  Stattdessen verwenden Sie: ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - user147787


Um Igor / Jauders Beitrag hinzuzufügen, können Sie, wenn Sie eine bestimmte IP-Adresse hören, Folgendes verwenden:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;

4
2018-02-25 13:11