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.