NameVirtualHosts를 사용하고 www로 리디렉션 할 때 ELB 상태 확인을 구성하려면 어떻게해야합니까?


8

HTTP 상태 확인이 실패하여 ELB에서 인스턴스를 계속 사용 중지합니다.

우리는 DNS 와일드 카드를 가지고 있으며 모든 것을 www로 리디렉션합니다 :

vhost.conf :

ServerName www.example.com
ServerAlias *.example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^ http://www.example.com/$1 [R=301,L]

이것은 실제 브라우저에서는 잘 작동하지만 HTTP 상태 확인은 실패하고 아마도 302가 발생하기 때문에 실패합니다.

TCP 상태 확인을 사용하는 가장 좋은 옵션입니까, 아니면 HTTP를 작동시키는 방법이 있습니까?


AWS가 상태 확인을 위해 전송 된 호스트 헤더를 사용자 정의 할 수있을 때까지 TCP 상태 확인을 사용하십시오. 웹 서버에 기본 항목이 있더라도 실제로 앱 상태를 확인하는 것이 아니라 웹 서버 만 tcp 포트가 열려 있는지 확인하는 것과 거의 같습니다.
Pykler

답변:


11

이 질문은 AWS 포럼 에서 요청되었으며 베어 IP 주소의 트래픽을 처리하고 리디렉션을 수행하지 않는 기본 가상 호스트를 설정하는 것이 답이었습니다. 이는 귀하의 IP 주소를 공격 한 일반 사용자도 리디렉션되지 않음을 의미합니다.

또는 다른 RewriteCond를 추가하여 ELB가 요청할 경로의 URL 부분을 지정하고 해당 경로를 무시할 수도 있습니다.

RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/health-check$
RewriteRule ^ http://www.example.com/$1 [R=301,L]

해당 URL을 방문한 일반 사용자는 리디렉션되지 않습니다.

동일한 기술을 사용하여 ELB의 User-Agent를 감지 할 수도 있습니다.

RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker
RewriteRule ^ http://www.example.com/$1 [R=301,L]

User-Agent를 스푸핑 한 일반 사용자는 리디렉션되지 않습니다.

또는 ELB의 내부 IP 주소.

RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteCond %{REMOTE_ADDR} !^10\.
RewriteRule ^ http://www.example.com/$1 [R=301,L]

이 옵션이 작동하려면 mod_rpaf(Apache 2.2의 경우) 또는 mod_remoteip(Apache 2.4 REMOTE_ADDR의 경우) X-Forwarded-For헤더 내용의 올바른 부분을 포함하도록 변수를 수정해야 합니다 . 이를 올바르게 설정하면 일반 사용자가 리디렉션 응답을 피할 수 없습니다.


기본 가상 호스트 설정의 문제점은 새 인스턴스가 회전 또는 재부팅 될 때마다 IP 주소가 변경되고 기본 AMI가 상태 확인을 지원하기를 원한다는 것입니다. 다른 옵션을 살펴 보겠습니다.
chris

포함 된 IP 주소 확인은 IP 주소가로 시작하는지 확인합니다 10.. IP 주소의 나머지 부분은 원하는만큼 변경 될 수 있으며 여전히 일치합니다. 10.*.*.*IP 주소 (또는 10.0.0.0/8) 범위는 인터넷을 통해 라우팅되지 않습니다.
Ladadadada

이미 원격 IP를 사용하여 요청자 IP 주소 (ELB IP가 아닌)를 기록하므로 세 번째 옵션이 작동했습니다. 감사합니다!
chris

0

가상 호스트를 추가하는 것은 좋은 생각이 아닙니다. 가상 호스트를 반영하려면 httpd 서비스를 다시 시작해야하기 때문입니다. 이 작업을 수행하는 다른 방법이 있습니다

  1. .htaccess 파일에서 ELB Health Check 경로를 무시하고
    다음
    elb_dns_name 과 같이 dns 이름의 네 부분을 모두 분리하십시오 . elb-name.subnet_zone.elb.amazonaws.com
  2. 나머지 모든 URL에는 내부 재 작성 규칙
    directory_scructure가 있습니다 : code_folder / website

    RewriteEngine On
    RewriteCond % {HTTP_HOST}! $ [NC]
    RewriteCond % {REQUEST_URI}! ^ / index.php $
    RewriteRule ^ (. *) $ / $ 1 [L, QSA]

이것은 나를 위해 아주 잘 작동했습니다. 더 나은 응원 방법이 있다면 제안하십시오!

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