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

최종 업데이트 날짜: 2018년 3월 21일

문제

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모두 없음(none)으로 설정하십시오.

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

Apache 백엔드가 연결을 동적으로 닫아 HTTP 504 오류가 클라이언트에 전송되므로 로드 밸런서에 등록된 백엔드 인스턴스에는 이벤트 MPM을 사용하면 안 됩니다.

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

  mod_prefork MPM mod_worker MPM
Timeout 65 65
KeepAliveTimeout 65 65
KeepAlive 켜짐 켜짐
MaxKeepAliveRequests 10,000 0
AcceptFilter http 없음 없음
AcceptFilter https 없음 없음