Yêu cầu HTTPS proxy đến phụ trợ HTTP với NGINX


30

Tôi đã cấu hình nginx để trở thành máy chủ web hiển thị bên ngoài của tôi, trò chuyện với phần phụ trợ qua HTTP.

Kịch bản tôi muốn đạt được là:

  1. Khách hàng thực hiện yêu cầu HTTP đến nginx, được chuyển hướng đến cùng một URL nhưng qua HTTPS
  2. nginx proxy yêu cầu qua HTTP đến phụ trợ
  3. nginx nhận được phản hồi từ phụ trợ qua HTTP.
  4. nginx chuyển lại điều này cho khách hàng qua HTTPS

Cấu hình hiện tại của tôi (nơi phụ trợ được cấu hình đúng) là:

máy chủ {
        nghe 80;
        server_name localhost;

        vị trí ~. * {
            proxy_pass http: // phụ trợ;
            proxy_redirect http: // backend https: // $ host;
            proxy_set_header Máy chủ lưu trữ $;
            }
        }

Vấn đề của tôi là phản hồi cho khách hàng (bước 4) được gửi qua HTTP chứ không phải HTTPS. Có ý kiến ​​gì không?

Câu trả lời:


6

Loại proxy bạn đang cố gắng thiết lập được gọi là proxy ngược. Một tìm kiếm nhanh cho nginx proxy ngược đã cho tôi trang này:

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

Ngoài việc thêm một số tính năng hữu ích như tiêu đề X-Forwarded-For (sẽ cung cấp cho ứng dụng của bạn khả năng hiển thị vào IP nguồn thực tế), cụ thể là:

proxy_redirect off

Chúc may mắn! :)


1
Cảm ơn phản hồi của bạn - liên kết thực sự rất hữu ích. Tôi nghĩ rằng tôi đã giải quyết vấn đề của mình bằng cách chia nhỏ nó - Tôi đã định cấu hình chuyển hướng cho tất cả các yêu cầu HTTP trên cổng 80 đến HTTPS trên cổng 443. Sau đó, tôi đã định cấu hình máy chủ mới trong cấu hình cho 443. Trước đây tôi đã cố gắng thực hiện tất cả cùng một nơi.
Mike

35

Tôi đang sử dụng cấu hình sau trong sản xuất

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

+1 Thêm proxy_set_header X-Forwarded-Proto https;đã thực hiện các mẹo cho tôi.
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;
  .....................
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.