nginx HTTPS mit derselben Konfiguration wie HTTP

195

Gibt es eine Möglichkeit, Konfigurationsanweisungen für zwei Nginx- server {}Blöcke freizugeben ? Ich möchte vermeiden, dass die Regeln dupliziert werden, da die HTTPS- und HTTP-Inhalte meiner Website mit genau derselben Konfiguration bereitgestellt werden.

Derzeit ist es so:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

Kann ich etwas in der Art von:

server {
  listen 80, 443;
  ...

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

Antworten:

262

Sie können dies wie folgt zu einem Serverblock zusammenfassen:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Offizielles How-To

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

Um die akzeptierte Antwort zu verdeutlichen, müssen Sie sie weglassen

SSL on;

und für die nginx version nach 0.8.21 brauchst du nur noch folgendes

listen 443 ssl;

Referenz:

Nginx Docs - Konfigurieren eines einzelnen HTTP / HTTPS-Servers

Sean Tan
quelle
2
Danke! Ich konnte nicht herausfinden, warum auf http nichts funktionierte. SSL entfernen ein; hat funktioniert.
Chris Cummings
27

Ich kenne keinen Weg, wie Sie ihn vorschlagen, aber es gibt sicherlich einen einfachen und wartbaren Weg.

Verschieben Sie allgemeine Servereinstellungen in eine separate Datei, z. B. "serverFoo.conf", und dann includein separate server {}Blöcke wie folgt :

server {
    listen 80;
    include serverFoo.conf;
}
server {
    listen 443 ssl;
    include serverFoo.conf;
}
dwc
quelle
2
+1 = funktioniert bei mir (Konnte mit der anderen Methode nicht zum
Das andere Beispiel berücksichtigt auch nicht 'proxy_pass', wenn es als Load Balancer fungiert.
Mike Purcell
Diese Option ist großartig, wenn Sie server_namefür jeden Port anders sind
iDev247
5
Benutze kein ssl mehr, benutze listen 443 ssl;ab sofort eins.
Gefahr89
Dies scheint die einzige Lösung zu sein, die mit dem aktuellen Nginx 1.10.1 funktioniert. Aus irgendeinem Grund werden zwei listenZeilen nicht richtig interpretiert, aber durch Verschieben in separate Zeilen wird dies server{}behoben.
Artur Bodera
9

Im Folgenden finden Sie ein ausführlicheres Beispiel für die bereits hilfreichen Antworten:

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;
}
Jonathan
quelle
2
Ich weiß , dass dies eine ziemlich alte Antwort, aber da es sehr fertig ist wollte ich nur für andere , darauf hinzuweisen , die es benutzen können , dass Sie das SSLv3 - Protokoll als anfällig für die POODLE Verwundbarkeit deaktivieren sollten: disablessl3.com Stattdessen verwenden: ssl_protocols TLSv1 TLSv1 .1 TLSv1.2;
user147787
4

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

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;
Matt Bostock
quelle