Elastic Load Balancing(ELB) Classic Load Balancer에서 HTTP 및 HTTPS 리스너를 사용합니다. Classic Load Balancer는 SSL을 오프로드하고 백엔드 연결은 단일 HTTP 포트(포트 80)에서 수신합니다. HTTP에서 HTTPS(포트 443)로 트래픽을 리디렉션하려고 하면 ‘ERR_TOO_MANY_REDIRECTS’ 오류가 발생합니다.
간략한 설명
Classic Load Balancer는 기본 기능으로 HTTP 트래픽을 HTTPS로 리디렉션하는 기능을 지원하지 않습니다. 이 작업을 수행하려면 Classic Load Balancer 뒤에 있는 웹 서버 인스턴스에서 재작성 규칙을 구성해야 합니다.
X-Forwarded-Proto 헤더를 사용하고 HTTP인 요청을 리디렉션하도록 웹 애플리케이션 서버의 재작성 규칙을 구성하십시오. 그렇지 않으면 재작성 규칙으로 인해 Classic Load Balancer와 로드 밸런서 뒤에 있는 인스턴스 간에 리디렉션 요청의 무한 루프가 생성될 수 있습니다. 이러한 루프로 인해 ‘ERR_TOO_MANY_REDIRECTS’ 오류가 발생합니다.
참고: Application Load Balancer는 HTTP 트래픽을 HTTPS로 리디렉션하는 데 사용할 수 있는 리디렉션 작업을 지원합니다. 이 기능을 사용하려면 Classic Load Balancer를 Application Load Balancer로 마이그레이션하십시오.
해결 방법
Apache, NGINX 및 IIS 웹 서버의 다음 구성 예시를 검토하십시오. X-Forwarded-Proto 헤더를 사용하여 클라이언트가 HTTP를 사용하는지 HTTPS를 사용하는지에 따라 트래픽을 전달하도록 Classic Load Balancer 뒤의 웹 서버를 구성합니다. 다음과 같은 재작성 규칙을 웹 서버에 추가해야 합니다.
- HTTP를 사용하여 클라이언트를 HTTPS URL로 리디렉션
- HTTPS를 사용하여 클라이언트에 직접 서비스 제공
참고: 구성 및 사용 사례에 따라 다음 구성 예시를 수정하십시오.
Apache 서버: 가상 호스트 파일 메서드
다음 방법을 사용하여 웹 서버를 구성하는 것이 가장 좋습니다.
-
Apache 구성 파일을 엽니다. 가능한 위치는 /etc/httpd/conf/httpd.conf(Apache 2/httpd), /etc/apache2/sites-enabled/(Apache 2.4) 또는 /etc/apache2/apache2.conf(Ubuntu의 Apache)입니다.
-
구성 파일의 VirtualHost 섹션에 다음과 유사한 재작성 규칙을 추가합니다.
<VirtualHost *:80>RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
-
Apache 구성 파일을 저장합니다.
-
Apache를 재시작합니다.
Apache 서버: .htaccess 파일 메서드
기본 Apache 구성 파일에 접근할 수 없는 경우 .htaccess 파일을 사용하십시오. 자세한 내용은 Apache 웹 사이트의 Apache HTTP 서버 튜토리얼: .htaccess 파일 페이지에서 .htaccess 파일을 사용하는 경우(사용하지 않는 경우) 섹션을 참조하십시오.
웹 서버를 구성하려면 다음 단계를 완료하십시오.
-
Apache 구성 파일을 엽니다. 가능한 위치는 /etc/httpd/conf/httpd.conf(Apache 2/httpd) 또는 /etc/apache2/sites-enabled/(Apache 2.4)입니다.
-
Directory 지시문을 편집하여 .htaccess를 활성화합니다.
<Directory "/var/www/html"> Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
-
Apache 구성 파일을 저장합니다.
-
.htaccess 파일을 엽니다.
-
다음과 유사한 재작성 규칙을 추가합니다.
RewriteEngine OnRewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
-
.htaccess 파일을 저장합니다.
-
Apache를 재시작합니다.
NGINX 서버
참고: 이 해결 방법은 NGINX 1.10.3(Ubuntu) 및 NGINX 1.12.1(Amazon Linux)에 적용됩니다.
다음 단계를 완료하십시오.
-
NGINX 구성 파일(nginx.conf)을 엽니다.
-
다음 재작성 규칙을 추가합니다. 구성에 대한 재작성 규칙을 수정해야 합니다.
server { listen 80;
server_name _;
if ($http_x_forwarded_proto = 'http'){
return 301 https://$host$request_uri;
}
}
-
NGINX를 재시작합니다.
IIS 서버
참고: 이 해결 방법은 Microsoft Windows Server 2012 R2 및 2016 Base에 적용됩니다.
다음 단계를 완료하십시오.
-
IIS URL 재작성 모듈을 설치합니다. 자세한 내용은 Microsoft 웹 사이트의 URL 재작성을 참조하십시오.
-
web.config 파일을 엽니다.
-
<system.webServer> 섹션에 다음 재작성 규칙을 추가합니다. 특정 구성에 대한 재작성 규칙을 수정하십시오.
<rewrite>
<rules>
<rule name="Rewrite HTTP to HTTPS" stopProcessing="true">
<match url="^(.*)$"/>
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$"/>
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}"/>
</rule>
</rules>
</rewrite>
-
web.config 파일을 저장합니다.
-
IIS 관리자를 엽니다.
-
기본 웹 사이트를 새로 고칩니다.
-
새 재작성 규칙이 URL Rewrite(URL 재작성) 섹션에 나타나는지 확인합니다.
-
웹 사이트를 다시 시작합니다.
-
리디렉션이 작동하는지 확인합니다.
관련 정보
Classic Load Balancing을 사용하도록 구성된 EC2 인스턴스에서 실행되는 웹 서버에 연결할 때 HTTP 5xx 오류가 발생하는 이유는 무엇입니까?