Question nginx HTTPS servant avec la même configuration que HTTP


Est-il possible de partager des directives de configuration sur deux nginx server {} des blocs? 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
  }
}

174
2018-05-21 16:18


origine




Réponses:


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

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Comment faire officiel


238
2018-05-21 18:54



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
Nginx fait toutes sortes de victoires. - Jauder Ho
et si vous avez plusieurs sites sur un serveur, il est à noter que le "défaut" n'est pas obligatoire - luchaninov
Si élégant que ça fait mal ... - Alix Axel
ne fonctionne pas ici ... "La requête HTTP simple a été envoyée au port HTTPS" - gcstr


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


81
2018-06-13 06:19



Je vous remercie! Je ne pouvais pas comprendre pourquoi rien sur http ne fonctionnait. Supprimer SSL sur; travaillé. - Chris Cummings


Je ne sais pas comment 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 include en séparé server {} des blocs comme ça:

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

25
2018-05-21 18:38



+1 = fonctionne pour moi. (Impossible de le faire fonctionner avec l'autre méthode.) - lackey
En outre, l'autre exemple ne prend pas en compte 'proxy_pass' s'il agit en tant qu'équilibreur de charge. - Mike Purcell
Cette option est idéale si votre server_name est différent pour chaque port - iDev247
Ne pas utiliser ssl sur, utilisez listen 443 ssl; À partir de 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 listen les lignes ne sont pas interprétées correctement, mais en les déplaçant pour les séparer server{} le corrige. - Artur Bodera


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

7
2018-05-10 17:48



Je sais que la réponse est plutôt ancienne, mais comme elle est très complète, je voudrais simplement signaler aux autres utilisateurs qui l’utilisent que vous devez désactiver le protocole SSLv3 car il est vulnérable à la vulnérabilité POODLE: disablessl3.com  Utilisez plutôt: ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - user147787


Juste pour ajouter au message de 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;

4
2018-02-25 13:11