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
  }
}
ceejayoz
la source

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

Jauder Ho
la source
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
87

Pour clarifier la réponse acceptée, vous devez omettre

SSL on;

et vous avez juste besoin des éléments suivants pour la version de nginx après la version 0.8.21

listen 443 ssl;

Référence:

Nginx Docs - Configuration d'un seul serveur HTTP / HTTPS

Sean Tan
la source
2
Je vous remercie! Je ne pouvais pas comprendre pourquoi rien sur http ne fonctionnait. Supprimer SSL sur; travaillé.
Chris Cummings
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;
}
dwc
la source
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;
}
Jonathan
la source
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;
Matt Bostock
la source