Pregunta Servidor HTTPS nginx con la misma configuración que HTTP


¿Hay alguna manera de compartir directivas de configuración entre dos nginx? server {} bloques? Me gustaría evitar la duplicación de las reglas, ya que el contenido de HTTPS y HTTP de mi sitio se entrega 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
  }
}

174
2018-05-21 16:18


origen




Respuestas:


Puedes combinar esto en un bloque de servidor así:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Manual de instrucciones


238
2018-05-21 18:54



Ah, no tenía idea de que nginx fuera lo suficientemente inteligente como para ignorar las directivas SSL si se cargaba en el puerto 80. ¡Increíble! - ceejayoz
nginx es todo tipo de WIN. - Jauder Ho
y si tiene varios sitios en un servidor, vale la pena mencionar que "predeterminado" no es obligatorio - luchaninov
Tan elegante que duele ... - Alix Axel
no funciona aquí ... "La solicitud HTTP sin formato se envió al puerto HTTPS" - gcstr


Para aclarar la respuesta aceptada, es necesario 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


81
2018-06-13 06:19



¡Gracias! No pude averiguar por qué no funcionaba nada en http. Eliminando SSL en; trabajó. - Chris Cummings


No conozco una manera 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 include en separado server {} bloques así

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

25
2018-05-21 18:38



+1 = funciona para mí. (No se pudo hacer funcionar con el otro método). - lackey
Además, el otro ejemplo no cuenta para 'proxy_pass' si actúa como un equilibrador de carga. - Mike Purcell
Esta opción es genial si tu server_name es diferente para cada puerto - iDev247
No uses ssl, usa listen 443 ssl; a partir de ahora una. - danger89
Esta parece ser la única solución que funciona con el reciente nginx 1.10.1. Por alguna razon dos listen Las líneas no se interpretan correctamente, pero moviéndolas para separarlas. server{} lo arregla - Artur Bodera


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

7
2018-05-10 17:48



Sé que esta es una respuesta bastante antigua, pero como es muy completa, solo quería señalar a otros que pueden usarla que deshabiliten el protocolo SSLv3, ya que es vulnerable a la vulnerabilidad de POODLE: disablessl3.com  En su lugar, utilice: ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - user147787


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

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;

4
2018-02-25 13:11