HTTPS nginx con la stessa configurazione di HTTP


195

Esiste un modo per condividere le direttive di configurazione su due server {}blocchi nginx ? Vorrei evitare di duplicare le regole, poiché i contenuti HTTPS e HTTP del mio sito sono pubblicati con la stessa identica configurazione.

Attualmente è così:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

Posso fare qualcosa del genere:

server {
  listen 80, 443;
  ...

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

Risposte:


262

È possibile combinare questo in un blocco server in questo modo:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

How-To ufficiale


6
Ah, non avevo idea che nginx fosse abbastanza intelligente da ignorare le direttive SSL se caricato sulla porta 80. Fantastico!
Ceejayoz,

72
nginx è ogni sorta di WIN.
Jauder Ho,

5
e se hai diversi siti su un server, vale la pena ricordare che "default" non è obbligatorio
luchaninov,

4
Così elegante che fa male ...
Alix Axel

3
non funziona qui ... "La semplice richiesta HTTP è stata inviata alla porta HTTPS"
gcstr,


27

Non conosco un modo come suggerisci tu, ma c'è sicuramente un modo facile e sostenibile.

Sposta le impostazioni comuni del server in un file separato, ad esempio "serverFoo.conf" e quindi includein server {}blocchi separati in questo modo:

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

2
+1 = funziona per me. (Impossibile farlo funzionare con l'altro metodo.)

Inoltre, l'altro esempio non tiene conto di "proxy_pass" se funge da bilanciamento del carico.
Mike Purcell,

Questa opzione è eccezionale se sei server_namediverso per ciascuna porta
iDev247,

5
Non usare ssl on, usa listen 443 ssl;da adesso uno.
danger89,

Questa sembra essere l'unica soluzione che funziona con la recente nginx 1.10.1. Per qualche motivo, due listenrighe non vengono interpretate correttamente, ma spostandole per separarle si server{}corregge.
Artur Bodera,

9

Espandendo le risposte già utili, ecco un esempio più completo:

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;
}

2
So che questa è una risposta piuttosto vecchio, ma in quanto è molto completo Volevo solo far notare agli altri che possono usare in modo che si dovrebbe disattivare il protocollo SSLv3 come vulnerabili alla vulnerabilità BARBONCINO: disablessl3.com utilizzare invece: ssl_protocols TLSv1 TLSv1 .1 TLSv1.2;
user147787

4

Solo per aggiungere al post di Igor / Jauder, se stai ascoltando un IP specifico puoi usare:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.