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
  }
}
ceejayoz
fuente

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

Jauder Ho
fuente
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
87

Para aclarar la respuesta aceptada, debe omitir

SSL on;

y solo necesitas lo siguiente para la versión nginx después de 0.8.21

listen 443 ssl;

Referencia:

Nginx Docs: configuración de un único servidor HTTP / HTTPS

Sean Tan
fuente
2
¡Gracias! No pude entender por qué nada en http funcionaba. Eliminar SSL en; trabajó.
Chris Cummings
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;
}
dwc
fuente
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;
}
Jonathan
fuente
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;
Matt Bostock
fuente