Permintaan HTTPS proksi ke backend HTTP dengan NGINX

30

Saya telah mengkonfigurasi nginx menjadi server web saya yang terlihat secara eksternal yang berbicara ke backend melalui HTTP.

Skenario yang ingin saya capai adalah:

  1. Klien membuat permintaan HTTP ke nginx yang dialihkan ke URL yang sama tetapi melalui HTTPS
  2. proksi nginx meminta melalui HTTP ke backend
  3. nginx menerima respons dari backend melalui HTTP.
  4. nginx meneruskan ini kembali ke klien melalui HTTPS

Konfigurasi saya saat ini (di mana backend dikonfigurasi dengan benar) adalah:

server {
        dengarkan 80;
        server_name localhost;

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

Masalah saya adalah respons terhadap klien (langkah 4) dikirim melalui HTTP bukan HTTPS. Ada ide?

Mike
sumber

Jawaban:

6

Jenis proxy yang Anda coba siapkan disebut proxy terbalik. Pencarian cepat untuk reverse proxy nginx memberi saya halaman ini:

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

Selain menambahkan beberapa fitur yang bermanfaat seperti header X-Forwarded-For (yang akan memberikan visibilitas aplikasi Anda ke IP sumber yang sebenarnya), ia secara khusus melakukan:

proxy_redirect off

Semoga berhasil! :)

Kyle Smith
sumber
1
Terima kasih atas tanggapan Anda - tautannya memang sangat membantu. Saya pikir saya telah memecahkan masalah saya dengan memecahnya - saya mengkonfigurasi redirect untuk semua permintaan HTTP pada port 80 ke HTTPS pada port 443. Saya kemudian mengkonfigurasi server baru di konfigurasi untuk 443. Saya sebelumnya mencoba melakukan semua ini tempat yang sama.
Mike
35

Saya menggunakan konfigurasi berikut dalam produksi

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
sumber
+1 Menambahkan proxy_set_header X-Forwarded-Proto https;melakukan trik untuk saya.
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
sumber