nginx HTTPS servant avec la même configuration que HTTP


195

Existe-t-il un moyen de partager les directives de configuration sur deux server {}blocs nginx ? J'aimerais éviter de dupliquer les règles, car les contenus HTTPS et HTTP de mon site sont servis avec exactement la même configuration.

Actuellement, c'est comme ça:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

Puis-je faire quelque chose dans le sens de:

server {
  listen 80, 443;
  ...

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

Réponses:


262

Vous pouvez combiner cela dans un bloc de serveur comme ceci:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Comment faire officiel


6
Ah, je ne savais pas que nginx était assez intelligent pour ignorer les directives SSL s'il était chargé sur le port 80. Génial!
ceejayoz

72
Nginx fait toutes sortes de victoires.
Jauder Ho

5
et si vous avez plusieurs sites sur un serveur, cela vaut la peine de mentionner que "défaut" n'est pas obligatoire
luchaninov

4
Si élégant que ça fait mal ...
Alix Axel

3
ne fonctionne pas ici ... "La requête HTTP simple a été envoyée au port HTTPS"
gcstr


27

Je ne connais pas un moyen comme vous le suggérez, mais il existe certainement un moyen facile et facile à maintenir.

Déplacez les paramètres de serveur communs dans un fichier séparé, c’est-à-dire "serverFoo.conf", puis includedans des server {}blocs séparés , comme suit :

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

2
+1 = fonctionne pour moi. (Impossible de le faire fonctionner avec l'autre méthode.)

En outre, l'autre exemple ne tient pas compte de 'proxy_pass' s'il agit en tant qu'équilibreur de charge.
Mike Purcell

Cette option est très bien si vous server_name
êtes

5
Ne pas utiliser ssl sur, utilisez listen 443 ssl;dès maintenant un.
danger89

Cela semble être la seule solution fonctionnant avec la dernière version de nginx 1.10.1. Pour une raison quelconque, deux listenlignes ne sont pas interprétées correctement, mais le fait de les déplacer séparément le server{}corrige.
Artur Bodera

9

En développant les réponses déjà utiles, voici un exemple plus complet:

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
Je sais que c'est une réponse assez vieux, mais comme il est très complet , je voulais juste signaler pour les autres qui peuvent l' utiliser que vous devez désactiver le protocole SSLv3 comme vulnérable à la vulnérabilité Caniche: disablessl3.com utiliser: ssl_protocols TLSv1 TLSv1 .1 TLSv1.2;
user147787

4

Juste pour ajouter au message d'Igor / Jauder, si vous écoutez une adresse IP spécifique, vous pouvez utiliser:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.