web-dev-qa-db-fra.com

Requêtes HTTPS proxy vers un backend HTTP avec NGINX

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 transmet 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?

33
Mike

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! :)

6
Kyle Smith

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