NGINX를 사용하여 HTTP 백엔드에 대한 HTTPS 요청 프록시


30

HTTP를 통해 백엔드와 통신하는 외부에서 볼 수있는 웹 서버로 nginx를 구성했습니다.

달성하려는 시나리오는 다음과 같습니다.

  1. 클라이언트는 HTTP 요청을 nginx로 보내고 동일한 URL로 리디렉션되지만 HTTPS를 통해 리디렉션됩니다.
  2. 백엔드에 HTTP를 통한 nginx 프록시 요청
  3. nginx는 HTTP를 통해 백엔드로부터 응답을받습니다.
  4. nginx는 이것을 HTTPS를 통해 클라이언트로 다시 전달합니다.

현재 설정 (백엔드가 올바르게 구성되어 있음)은 다음과 같습니다.

서버 {
        듣고 80;
        server_name 로컬 호스트;

        위치 ~. * {
            proxy_pass http : // backend;
            proxy_redirect http : // backend https : // $ host;
            proxy_set_header 호스트 $ host;
            }
        }

내 문제는 클라이언트에 대한 응답 (4 단계)이 HTTPS가 아닌 HTTP를 통해 전송된다는 것입니다. 어떤 아이디어?

답변:


6

설정하려는 프록시 유형을 리버스 프록시라고합니다. 리버스 프록시 nginx에 대한 빠른 검색으로이 페이지가 나타납니다.

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

X-Forwarded-For 헤더 (실제 소스 IP에 대한 앱 가시성을 제공)와 같은 유용한 기능을 추가하는 것 외에도 다음과 같은 이점이 있습니다.

proxy_redirect off

행운을 빕니다! :)


1
답변 주셔서 감사합니다-링크가 실제로 매우 도움이되었습니다. 문제를 분할하여 문제를 해결했다고 생각합니다. 포트 80의 모든 HTTP 요청에 대해 포트 443의 HTTPS로 리디렉션을 구성했습니다. 그런 다음 443의 구성에서 새 서버를 구성했습니다. 이전에이 모든 작업을 수행하려고했습니다. 같은 장소.
Mike

35

프로덕션 환경에서 다음 구성을 사용하고 있습니다.

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 추가로 proxy_set_header X-Forwarded-Proto https;속임수가되었습니다.
파이살 페 로즈

-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;
  .....................
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.