Requêtes HTTPS proxy vers un backend HTTP avec NGINX

30

J'ai nginx configuré pour être mon serveur web visible de l'extérieur qui parle à un backend via HTTP.

Le scénario que je veux réaliser est:

  1. Le client fait une requête HTTP à nginx qui est redirigé vers la même URL mais via HTTPS
  2. demande de proxy nginx via HTTP au backend
  3. nginx reçoit la réponse du backend via HTTP.
  4. nginx le renvoie au client via HTTPS

Ma configuration actuelle (où le backend est configuré correctement) est:

serveur {
        écouter 80;
        nom_serveur localhost;

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

Mon problème est que la réponse au client (étape 4) est envoyée via HTTP et non HTTPS. Des idées?

Mike
la source

Réponses:

6

Le type de proxy que vous essayez de configurer est appelé proxy inverse. Une recherche rapide de proxy inverse nginx m'a donné cette page:

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

En plus d'ajouter quelques fonctionnalités utiles comme un en-tête X-Forwarded-For (qui donnera à votre application une visibilité sur l'IP source réelle), elle le fait spécifiquement:

proxy_redirect off

Bonne chance! :)

Kyle Smith
la source
1
Merci pour votre réponse - le lien a en effet été très utile. Je pense que j'ai résolu mon problème en le divisant - j'ai configuré une redirection pour toutes les requêtes HTTP sur le port 80 vers HTTPS sur le port 443. J'ai ensuite configuré un nouveau serveur dans la configuration pour 443. J'essayais précédemment de faire tout cela même endroit.
Mike
35

J'utilise la configuration suivante en production

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
la source
+1 L'ajout a proxy_set_header X-Forwarded-Proto https;fait l'affaire pour moi.
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
la source