Vraag nginx HTTPS-server met dezelfde config als HTTP


Is er een manier om configuratierichtlijnen te delen via twee nginx server {} blokken? Ik wil voorkomen dat de regels worden gedupliceerd, omdat de HTTPS- en HTTP-inhoud van mijn site wordt aangeboden met exact dezelfde configuratie.

Momenteel is het zo:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

Kan ik iets doen in de trant van:

server {
  listen 80, 443;
  ...

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

174
2018-05-21 16:18


oorsprong




antwoorden:


U kunt dit in één serverblok combineren zoals:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Officiële instructies


238
2018-05-21 18:54



Ah, ik had geen idee dat nginx intelligent genoeg was om de SSL-richtlijnen te negeren, indien geladen via poort 80. Geweldig! - ceejayoz
nginx is allerlei soorten WIN. - Jauder Ho
en als u meerdere sites op één server hebt, is het de moeite waard te vermelden dat "standaard" niet verplicht is - luchaninov
Zo elegant dat het pijn doet ... - Alix Axel
werkt hier niet ... "Het eenvoudige HTTP-verzoek is verzonden naar de HTTPS-poort" - gcstr


Om het geaccepteerde antwoord te verduidelijken, moet u weglaten

SSL on;

en je hebt gewoon het volgende nodig voor nginx-versie na 0.8.21

listen 443 ssl;

Referentie:

Nginx Docs - Configureren Een enkele HTTP / HTTPS-server


81
2018-06-13 06:19



Dank je! Ik kon niet achterhalen waarom niets op http werkte. SSL verwijderen op; werkte. - Chris Cummings


Ik ken geen manier zoals je suggereert, maar er is zeker een eenvoudige en onderhoudbare manier.

Verplaats algemene serverinstellingen naar een afzonderlijk bestand, d.w.z. "serverFoo.conf" en vervolgens include het in apart server {} blokken zoals zo:

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

25
2018-05-21 18:38



+1 = werkt voor mij. (Kon het niet werken met de andere methode.) - lackey
Het andere voorbeeld houdt ook geen rekening met 'proxy_pass' als het optreedt als een load-balancer. - Mike Purcell
Deze optie is geweldig als je server_name is anders voor elke poort - iDev247
Gebruik ssl niet, gebruik listen 443 ssl; van nu af aan. - danger89
Dit lijkt de enige oplossing te zijn die werkt met recente nginx 1.10.1. Om de een of andere reden twee listen lijnen worden niet correct geïnterpreteerd, maar verplaatst ze om te scheiden server{} repareert het. - Artur Bodera


Uitbreiding van de al nuttige antwoorden, hier is een completer voorbeeld:

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



Ik weet dat dit een behoorlijk oud antwoord is, maar omdat het erg compleet is, wilde ik er alleen maar op wijzen dat het SSLv3-protocol als kwetsbaar voor de POODLE-kwetsbaarheid moet worden uitgeschakeld: disablessl3.com  Gebruik in plaats daarvan: ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - user147787


Gewoon om toe te voegen aan het bericht van Igor / Jauder, als je naar een specifiek IP-adres luistert, kun je het volgende gebruiken:

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

4
2018-02-25 13:11