Solicitudes HTTPS proxy a un backend HTTP con NGINX

30

Tengo nginx configurado para ser mi servidor web visible externamente que se comunica con un backend a través de HTTP.

El escenario que quiero lograr es:

  1. El cliente realiza una solicitud HTTP a nginx que se redirige a la misma URL pero a través de HTTPS
  2. Solicitud de proxies nginx sobre HTTP al backend
  3. nginx recibe respuesta del backend sobre HTTP.
  4. nginx pasa esto al cliente a través de HTTPS

Mi configuración actual (donde el backend está configurado correctamente) es:

servidor {
        escucha 80;
        nombre_servidor localhost;

        ubicación ~. * {
            proxy_pass http: // backend;
            proxy_redirect http: // backend https: // $ host;
            proxy_set_header Host $ host;
            }
        }

Mi problema es que la respuesta al cliente (paso 4) se envía a través de HTTP, no HTTPS. ¿Algunas ideas?

Micro
fuente

Respuestas:

6

El tipo de proxy que está intentando configurar se llama proxy inverso. Una búsqueda rápida de proxy inverso nginx me consiguió esta página:

http://intranation.com/entries/2008/09/using-nginx-reverse-proxy/

Además de agregar algunas características útiles como un encabezado X-Fordered-For (que le dará visibilidad a su aplicación en la IP de origen real), específicamente hace:

proxy_redirect off

¡Buena suerte! :)

Kyle Smith
fuente
1
Gracias por su respuesta, el enlace fue realmente muy útil. Creo que he resuelto mi problema dividiéndolo: configuré una redirección para todas las solicitudes HTTP en el puerto 80 a HTTPS en el puerto 443. Luego configuré un nuevo servidor en la configuración para 443. Anteriormente estaba tratando de hacer todo esto mismo lugar.
Mike
35

Estoy usando la siguiente configuración en producción

server {
    listen xxx.xxx.xxx.xxx:80;
    server_name www.example.net;

    rewrite ^(.*) https://$server_name$1 permanent;
}

server {
    listen xxx.xxx.xxx.xxx:443;
    server_name www.example.net;

    root   /vhosts/www.example.net;

    ssl                  on;
    ssl_certificate      /etc/pki/nginx/www.example.net.crt;
    ssl_certificate_key  /etc/pki/nginx/www.example.net.key;

    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    ssl_dhparam /etc/pki/nginx/dh2048.pem;

    # intermediate configuration. tweak to your needs.
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}
ALex_hha
fuente
+1 Agregar proxy_set_header X-Forwarded-Proto https;hizo el truco para mí.
Faisal Feroz
-3
server {

    listen 80;
    server_name www.example.net example.net;

   rewrite ^/(.*)$ https://$host$request_uri? permanent; 
}

server {
  listen 443;
  server_name www.example.net example.net;
  .....................
Zhang Jun
fuente