Classic Load Balancer를 사용할 때 반환되는 504 오류를 어떻게 해결합니까?

3분 분량
0

Classic Load Balancer 액세스 로그, Amazon CloudWatch 지표 또는 Classic Load Balancer를 통해 내 서비스에 연결할 때 HTTP 504 오류가 표시됩니다.

해결 방법

HTTP 504 오류는 게이트웨이 또는 프록시가 시간 초과되었음을 나타내는 HTTP 상태 코드입니다. 문제 해결 시 다음 사항을 조사하십시오.

로드 밸런서의 유휴 제한 시간을 확인한 다음 필요한 경우 수정

HTTP 504 오류가 반환되는 가장 일반적인 이유는 해당 인스턴스가 구성된 유휴 제한 시간 내에 요청에 응답하지 않았기 때문입니다. 기본적으로 Classic Load Balancer의 유휴 제한 시간은 60초입니다.

CloudWatch 지표가 활성화된 경우 로드 밸런서에 대한 CloudWatch 지표를 확인하십시오. 지연 시간 데이터 포인트가 구성된 로드 밸런서 제한 시간 값과 동일하고 HTTPCode_ELB_5XX에 데이터 포인트가 있는 경우 하나 이상의 요청이 시간 초과된 것입니다.

이 문제를 해결하려면 다음 두 가지 중 하나를 수행하면 됩니다.

  • HTTP 요청이 유휴 제한 시간 내에 완료되도록 로드 밸런서의 유휴 제한 시간을 수정합니다.
  • 더 빠르게 응답할 수 있도록 애플리케이션을 조정합니다.

백엔드 인스턴스가 연결을 열린 상태로 유지하는지 확인

백엔드 인스턴스가 유휴 제한 시간 값에 도달하기 전에 로드 밸런서에 대한 TCP 연결을 종료하면 HTTP 504 오류가 표시될 수 있습니다.

이 문제를 해결하려면, 백엔드 인스턴스에서 연결 유지 설정을 활성화하고 연결 유지 제한 시간을 로드 밸런서의 유휴 제한 시간보다 큰 값으로 설정합니다.

(Apache 전용) TCP_DEFER_ACCEPT 비활성화

Apache 백엔드 인스턴스에 TCP_DEFER_ACCEPT가 활성화되면 로드 밸런서는 백엔드 인스턴스로 SYN을 전송하여 연결을 시작합니다. 그러면 백엔드 인스턴스가 SYN-ACK로 응답하고 로드 밸런서가 빈 ACK를 백엔드 인스턴스로 전송합니다.

마지막 ACK가 비어 있기 때문에 백엔드는 ACK를 수락하지 않고 대신 로드 밸런서에 SYN-ACK를 다시 전송합니다. 이로 인해 후속 SYN 재시도 시간 초과가 발생할 수 있습니다. 백엔드 인스턴스가 연결을 종료하기 전에 FIN 또는 RST가 전송되지 않으면 로드 밸런서는 연결이 설정된 것으로 간주하지만 실제로는 연결이 설정되지 않았습니다. 그런 다음 로드 밸런서가 이 TCP 연결을 통해 요청을 보내면 백엔드가 RST로 응답하여 504 오류가 발생합니다.

이 문제를 해결하려면 AcceptFilter httpAcceptFilter https모두 없음으로 설정하십시오.

(Apache 전용) 이벤트 MPM을 비활성화하고 prefork 및 작업자 MPM을 최적으로 구성합니다.

모범 사례는 로드 밸런서에 등록된 백엔드 인스턴스에서 이벤트 MPM을 비활성화하는 것입니다. Apache 백엔드가 동적으로 연결을 끊기 때문에 이렇게 연결이 끊어지면 HTTP 504 오류가 발생할 수 있습니다.

prefork작업자 MPM을 사용하고 로드 밸런서가 60초의 유휴 시간 초과로 구성되어 있다고 가정할 때 성능을 최적화하려면 다음 값을 사용합니다.

mod_prefork MPMmod_worker MPM
Timeout6565
KeepAliveTimeout6565
KeepAlive켜짐켜짐
MaxKeepAliveRequests10,0000
AcceptFilter http없음없음
AcceptFilter https없음없음

관련 정보

Classic Load Balancer 모니터링

Classic Load Balancer 문제 해결: HTTP 오류

Apache 또는 NGINX를 ELB에 대한 백엔드 서버로 사용하기 위한 최적의 설정은 무엇입니까?

AWS 공식
AWS 공식업데이트됨 2년 전