nginx HTTPS que sirve con la misma configuración que HTTP


195

¿Hay alguna manera de compartir directivas de configuración en dos server {}bloques nginx ? Me gustaría evitar duplicar las reglas, ya que el contenido HTTPS y HTTP de mi sitio se sirve con la misma configuración exacta.

Actualmente, es así:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

¿Puedo hacer algo en la línea de:

server {
  listen 80, 443;
  ...

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

Respuestas:


262

Puede combinar esto en un bloque de servidor de esta manera:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Instrucciones oficiales


66
Ah, no tenía idea de que nginx era lo suficientemente inteligente como para ignorar las directivas SSL si se cargaba a través del puerto 80. ¡Impresionante!
ceejayoz

72
nginx es todo tipo de WIN.
Jauder Ho

55
y si tiene varios sitios en un servidor, vale la pena mencionar que "predeterminado" no es obligatorio
luchaninov

44
Tan elegante que duele ...
Alix Axel

3
no funciona aquí ... "La solicitud HTTP simple se envió al puerto HTTPS"
gcstr


27

No conozco una forma como usted sugiere, pero ciertamente hay una manera fácil y fácil de mantener.

Mueva la configuración común del servidor a un archivo separado, es decir, "serverFoo.conf" y luego includeen server {}bloques separados de la siguiente manera:

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

2
+1 = funciona para mí. (No se pudo hacer que funcione con el otro método)

Además, el otro ejemplo no tiene en cuenta 'proxy_pass' si actúa como un equilibrador de carga.
Mike Purcell

Esta opción es excelente si server_namees diferente para cada puerto
iDev247

55
No use ssl on, use a listen 443 ssl;partir de ahora uno.
danger89

Esta parece ser la única solución que funciona con nginx 1.10.1 reciente. Por alguna razón, dos listenlíneas no se interpretan correctamente, pero moverlas para separarlo lo server{}arregla.
Artur Bodera

9

Ampliando las respuestas ya útiles, aquí hay un ejemplo más 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
Sé que esto es una respuesta bastante viejo, pero ya que es muy completa Sólo quería señalar a otros que lo puedan utilizar que se debe desactivar el protocolo SSLv3 como vulnerable a la vulnerabilidad CANICHE: disablessl3.com usar en su lugar: ssl_protocols TLSv1 TLSv1 .1 TLSv1.2;
user147787

4

Solo para agregar a la publicación de Igor / Jauder, si está escuchando una IP específica, puede usar:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.