Proxy-HTTPS-Anforderungen an ein HTTP-Backend mit NGINX

30

Ich habe Nginx als meinen extern sichtbaren Webserver konfiguriert, der über HTTP mit einem Backend kommuniziert.

Das Szenario, das ich erreichen möchte, ist:

  1. Der Client sendet eine HTTP-Anfrage an nginx, die über HTTPS an dieselbe URL umgeleitet wird
  2. Nginx-Proxies fordern über HTTP das Backend an
  3. nginx erhält eine Antwort vom Backend über HTTP.
  4. nginx gibt dies über HTTPS an den Client zurück

Meine aktuelle Konfiguration (wo das Backend richtig konfiguriert ist) ist:

Server {
        höre 80;
        Servername localhost;

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

Mein Problem ist, dass die Antwort an den Client (Schritt 4) über HTTP und nicht über HTTPS gesendet wird. Irgendwelche Ideen?

Mike
quelle

Antworten:

6

Der Proxy-Typ, den Sie einrichten möchten, wird als Reverse-Proxy bezeichnet. Eine schnelle Suche nach Reverse Proxy Nginx brachte mir diese Seite:

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

Zusätzlich zum Hinzufügen einiger nützlicher Funktionen, wie eines X-Forwarded-For-Headers (der Ihrer App Einblick in die tatsächliche Quell-IP gibt), werden folgende Aktionen ausgeführt:

proxy_redirect off

Viel Glück! :)

Kyle Smith
quelle
1
Vielen Dank für Ihre Antwort - der Link war in der Tat sehr hilfreich. Ich glaube, ich habe mein Problem durch Aufteilen gelöst. Ich habe eine Umleitung für alle HTTP-Anforderungen auf Port 80 zu HTTPS auf Port 443 konfiguriert. Ich habe dann einen neuen Server in der Konfiguration für 443 konfiguriert. Ich habe zuvor versucht, dies alles zu tun gleicher Ort.
Mike
35

Ich verwende die folgende Konfiguration in der Produktion

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
quelle
+1 Hinzufügen proxy_set_header X-Forwarded-Proto https;hat den Trick für mich getan.
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
quelle