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 오류가 표시될 수 있습니다.
이 문제를 해결하려면 백엔드 인스턴스에서 keep-alive 설정을 활성화한 다음 keep-alive 제한 시간을 로드 밸런서의 유휴 제한 시간보다 큰 값으로 설정하십시오.
(Apache만 해당) TCP_DEFER_ACCEPT 끄기
Apache 백엔드 인스턴스에 대해 TCP_DEFER_ACCEPT가 활성화되면 로드밸런서는 백엔드 인스턴스에 SYN을 전송하여 연결을 시작합니다. 그러면 백엔드 인스턴스는 SYN-ACK로 응답하고 로드밸런서는 빈 ACK를 백엔드 인스턴스로 보냅니다.
마지막 ACK가 비어 있기 때문에 백엔드는 ACK를 수락하지 않고 대신 로드밸런서에 SYN-ACK을 재전송합니다. 이로 인해 후속 SYN 재시도 제한 시간이 초과될 수 있습니다. 백엔드 인스턴스가 연결을 종료하기 전에 FIN 또는 RST가 전송되지 않으면 로드 밸런서는 연결이 설정된 것으로 간주하지만 실제로는 그렇지 않습니다. 그런 다음 로드 밸런서가 이 TCP 연결을 통해 요청을 보내면 백엔드는 504 오류를 생성하는 RST로 응답합니다.
이 문제를 해결하려면 AcceptFilter http 및 AcceptFilter https를 모두 없음으로 설정하십시오.
(Apache만 해당) 이벤트 MPM을 끄고 프리포크 및 작업자 MPM을 최적으로 구성합니다.
로드 밸런서에 등록된 백엔드 인스턴스에서 이벤트 MPM을 끄는 것이 가장 좋습니다. Apache 백엔드는 동적으로 연결을 닫기 때문에 이러한 연결이 끊어지면 HTTP 504 오류가 발생할 수 있습니다. 자세한 내용은 Apache 웹 사이트의 Apache MPM 이벤트를 참조하십시오.
프리포크 및 작업자 MPM을 사용하고 로드 밸런서가 60초의 유휴 제한 시간으로 구성되어 있다고 가정할 때 최적의 성능을 얻으려면 다음 값을 사용하십시오.
| | |
---|
| mod_prefork MPM | mod_worker MPM |
Timeout | 65 | 65 |
KeepAliveTimeout | 65 | 65 |
KeepAlive | 켜짐 | 켜짐 |
MaxKeepAliveRequests | 10000 | 0 |
AcceptFilter http | 없음 | 없음 |
AcceptFilter https | 없음 | 없음 |
자세한 내용은 Apache 웹 사이트에서 Apache MPM 워커 및 Apache MPM 프리포크를 참조하세요.
관련 정보
Classic Load Balancer 모니터링
Classic Load Balancer 문제 해결: HTTP 오류
ELB의 백엔드 서버로 Apache 또는 NGINX를 사용하기 위한 최적의 설정은 무엇인가요?