HTTP 504 상태 코드(게이트웨이 제한 시간)
HTTP 504 상태 코드(게이트웨이 시간 초과)는 CloudFront가 오리진에 요청을 전달했을 때(요청된 객체가 엣지 캐시에 없었기 때문에) 다음 중 하나가 발생했음을 나타냅니다.
-
오리진이 CloudFront에 HTTP 504 상태 코드를 반환했습니다.
-
요청이 만료되기 전에 오리진이 응답하지 않았습니다.
방화벽 또는 보안 그룹에 의해 오리진에 대해 트래픽이 차단된 경우나 오리진이 인터넷에서 액세스가 불가능한 경우에 CloudFront는 HTTP 504 상태 코드를 반환합니다. 이러한 문제들이 있는지 먼저 확인합니다. 그런 다음, 액세스 문제가 아닌 경우에는 애플리케이션 지연 및 서버 제한 시간을 탐색하여 문제를 확인하고 시정합니다.
주제
CloudFront 트래픽을 허용하도록 원본 서버에서 방화벽 구성
오리진 서버의 방화벽에 의해 CloudFront 트래픽이 차단되는 경우에 CloudFront는 HTTP 504 상태 코드를 반환하는데, 다른 문제를 확인하기 전에 먼저 이 문제가 아닌지 확인하는 것이 좋습니다.
이것이 방화벽 문제인지를 판단하기 위해 사용하는 방법은 오리진 서버가 사용하는 시스템에 따라 다릅니다.
-
Linux 서버에서 IPTable 방화벽을 사용하는 경우에는 IPTable에서의 작업에 도움이 되는 도구 및 정보를 검색할 수 있습니다.
-
Windows 서버에서 Windows 방화벽을 사용하는 경우에는 Microsoft 설명서의 방화벽 규칙 추가 또는 편집
을 참조하세요.
오리진 서버에서 방화벽 구성을 평가할 때는 게시된 IP 주소 범위를 토대로 CloudFront 엣지 로케이션에서의 트래픽을 차단하는 방화벽이나 보안 규칙이 있는지 찾아봅니다. 자세한 내용은 CloudFront 엣지 서버의 위치 및 IP 주소 범위 단원을 참조하십시오.
CloudFront IP 주소 범위가 오리진 서버에 연결하도록 허용되는 경우, 변경 사항이 포함되도록 서버의 보안 규칙을 업데이트합니다. Amazon SNS 주제를 구독하면 IP 주소 범위 파일이 업데이트될 때 알림을 수신할 수 있습니다. 알림을 수신한 후에는 코드를 사용하여 파일을 찾아서 구문 분석하고 로컬 환경에 맞게 조정할 수 있습니다. 자세한 내용은 AWS 뉴스 블로그에서 Amazon SNS를 통한 AWS 퍼블릭 IP 주소 변경 사항 구독
CloudFront 트래픽을 허용하도록 원본 서버에서 보안 그룹 구성
오리진이 Elastic Load Balancing을 사용하는 경우에는 ELB 보안 그룹을 검토해서 보안 그룹이 CloudFront에서의 인바운드 트래픽을 허용하는지 확인합니다.
또한 AWS Lambda를 사용하여 보안 그룹을 자동 업데이트함으로써 CloudFront에서의 인바운드 트래픽을 허용할 수도 있습니다.
사용자 지정 원본 서버를 인터넷에서 액세스할 수 있도록 설정
인터넷에서 공개적으로 사용할 수 없기 때문에 CloudFront가 사용자 지정 오리진 서버를 액세스할 수 없는 경우, CloudFront는 HTTP 504 오류를 반환합니다.
CloudFront 엣지 로케이션은 인터넷을 통해 오리진 서버에 연결됩니다. 사용자 지정 오리진이 사설 네트워크에 있는 경우에는 CloudFront가 이를 액세스할 수 없습니다. 따라서 내부 Classic Load Balancer를 포함한 프라이빗 서버를 CloudFront에서 오리진 서버로 사용할 수 없습니다.
인터넷 트래픽을 오리진 서버에 연결할 수 있는지 확인하려면 다음 명령(OriginDomainName
은 서버의 도메인 이름)을 실행하세요.
HTTPS 트래픽의 경우:
-
nc -zv
OriginDomainName
443 -
telnet
OriginDomainName
443
HTTP 트래픽의 경우:
-
nc -zv
OriginDomainName
80 -
telnet
OriginDomainName
80
원본 서버의 애플리케이션에서 지연된 응답을 찾아서 수정
애플리케이션에서 응답에 너무 많은 시간이 소요되거나 제한 시간 값이 너무 낮게 설정된 결과로 인해 서버 제한 시간이 발생하는 경우가 종종 있습니다.
HTTP 504 오류를 방지하기 위한 일시적인 해결책으로 배포 시 CloudFront 제한 시간 값을 더 높게 설정하는 방법이 있기는 합니다. 그러나 애플리케이션 및 오리진 서버에서 성능 및 지연 문제가 해결되었는지 먼저 확인하는 것이 좋습니다. 제한 시간 값을 적당하게 설정하면 HTTP 504 오류를 방지하고 사용자에게 뛰어난 응답성을 제공할 수 있습니다.
여기에는 성능 문제를 찾아서 해결할 때 거치게 되는 단계들이 개략적으로 나와 있습니다.
-
정상 부하 및 고부하에서 웹 애플리케이션의 지연 시간(응답성)을 측정합니다.
-
필요할 경우 CPU나 메모리 같은 리소스를 추가합니다. 고부하 상황을 지원하도록 데이터베이스 쿼리를 튜닝하는 등 문제 해결을 위한 기타 조치를 취합니다.
-
필요할 경우 CloudFront 배포의 제한 시간 값을 조정합니다.
아래에는 각 단계에 대한 세부 정보가 나와 있습니다.
정상 부하 및 고부하에서 지연 시간 측정
하나 이상의 백엔드 웹 애플리케이션 서버가 고부하를 경험하고 있는지 판단하려면 각 서버에서 아래의 Linux curl 명령을 실행합니다.
curl -w "DNS Lookup Time: %{time_namelookup} \nConnect time: %{time_connect} \nTLS Setup: %{time_appconnect} \nRedirect Time: %{time_redirect} \nTime to first byte: %{time_starttransfer} \nTotal time: %{time_total} \n" -o /dev/null https://www.example.com/yourobject
참고
서버에서 Windows를 실행하는 경우에는 유사한 명령을 실행하도록 Windows용 cURL을 검색 및 다운로드할 수 있습니다.
서버에서 실행되는 애플리케이션의 지연 시간을 측정 및 평가할 때는 다음 사항에 유의하십시오.
-
지연 값은 각 애플리케이션에 상대적입니다. 하지만 초 단위가 아니라 밀리초 단위의 TTFB(Time To First Byte)가 적당합니다.
-
정상 부하에서 애플리케이션 지연 시간을 측정한 결과 문제가 없었더라도 고부하에서는 최종 사용자가 제한 시간을 경험할 수 있다는 점에 유의하세요. 수요가 높으면 서버에서 응답이 지연되거나 아예 응답이 없을 수 있습니다. 고부하 지연 문제를 방지하려면 CPU, 메모리, 디스크 읽기/쓰기 같은 서버의 리소스를 확인하여 고부하에 맞게 서버 용량을 확장합니다.
다음 Linux 명령을 실행하여 Apache 프로세스에서 사용되는 메모리를 확인할 수 있습니다.
watch -n 1 "echo -n 'Apache Processes: ' && ps -C apache2 --no-headers | wc -l && free -m"
-
서버에서 CPU 활용도가 높으면 애플리케이션 성능이 크게 낮아질 수 있습니다. 백엔드 서버에서 Amazon EC2 인스턴스를 사용하는 경우에는 서버의 CloudWatch 지표를 검토하여 CPU 활용도를 확인합니다. 자세한 내용은 Amazon CloudWatch 사용 설명서를 참조하십시오. 자체 서버를 사용 중인 경우에는 서버 도움말 문서에서 CPU 활용도를 확인할 수 있는 방법에 대한 지침을 참조하세요.
-
요청의 수가 많을 때 데이터베이스 쿼리의 실행 속도가 느려지는 것과 같이 고부하 상황에서 발생할 수 있는 기타 문제들을 확인하세요.
리소스를 추가하고 서버 및 데이터베이스 튜닝
애플리케이션 및 서버의 응답성을 평가한 후에는 정상 부하 및 고부하 상황을 위해 충분한 리소스가 구축되어 있는지 확인합니다.
-
자체 서버를 가지고 있는 경우에는 평가 결과를 토대로 CPU, 메모리 및 디스크 공간이 최종 사용자 요청을 처리하기에 충분한지 확인합니다.
-
Amazon EC2 인스턴스를 백엔드 서버로 사용하는 경우 인스턴스 유형에 수신 요청을 이행하기에 적절한 리소스가 있는지 확인합니다. 자세한 내용을 알아보려면 Amazon EC2 사용 설명서의 인스턴스 유형을 참조하세요.
뿐만 아니라, 제한 시간을 방지하려면 다음과 같은 튜닝 조치를 고려하십시오.
-
cURL 명령이 반환한 TTFB(Time To First Byte) 값이 높은 경우에는 애플리케이션의 성능을 개선하기 위한 조치를 취합니다. 애플리케이션 응답성을 높이면 제한 시간 오류가 줄어듭니다.
-
성능 저하 없이 많은 양의 요청을 처리할 수 있도록 데이터베이스 쿼리를 튜닝합니다.
-
백엔드 서버에서 연결 유지(영구)
연결을 설정합니다. 이 옵션은 후속 요청이나 사용자에 대해 연결을 다시 설정해야 하는 경우에 발생하는 지연을 방지하는 데 도움이 됩니다. -
Elastic Load Balancing를 오리진으로 사용하는 경우, 504 오류가 발생할 수 있는 원인은 다음과 같습니다.
연결 제한 시간이 만료(10초)되기 전에 로드 밸런서가 대상에 대한 연결을 설정하지 못합니다.
로드 밸런서가 대상에 대한 연결을 설정하지만, 유휴 제한 시간이 끝나기 전에 대상이 응답을 하지 않습니다.
서브넷의 네트워크 액세스 제어 목록(ACL)이 휘발성 포트(1024-65535)에서 대상으로부터 로드 밸런서 노드로의 트래픽을 허용하지 않습니다.
대상이 개체 몸체보다 큰 콘텐츠 길이 헤더를 반환합니다. 로드 밸런서가 놓친 바이트를 기다리는 도중 시간이 초과됩니다.
대상이 Lambda 함수이고 Lambda 서비스가 연결 제한 시간이 만료되기 전에 응답하지 않습니다.
지연 시간 단축에 대한 자세한 내용은 ELB Classic Load Balancer의 지연 시간이 긴 문제를 해결하려면 어떻게 해야 하나요?
를 참조하세요. -
MediaTailor를 오리진으로 사용하는 경우, 504 오류가 발생할 수 있는 원인은 다음과 같습니다.
상대 URL을 잘못 처리하는 경우 MediaTailor는 플레이어로부터 잘못된 형식의 URL을 수신할 수 있습니다.
MediaPackage가 MediaTailor의 매니페스트 오리진인 경우 MediaPackage 404 매니페스트 오류로 인해 MediaTailor가 504 오류를 반환할 수 있습니다.
MediaTailor 오리진 서버에 대한 요청을 완료하는 데 2초 이상 걸립니다.
-
Amazon API Gateway를 오리진으로 사용하는 경우, 504 오류가 발생할 수 있는 원인은 다음과 같습니다.
통합 요청이 API Gateway REST API 최대 통합 제한 시간 파라미터보다 오래 걸립니다. 자세한 내용은 API Gateway의 API HTTP 504 제한 시간 오류를 해결하려면 어떻게 해야 하나요?
를 참조하세요.
필요할 경우 CloudFront 제한 시간 값을 조정합니다.
애플리케이션 성능 저하, 오리진 서버 용량 및 기타 문제를 평가하고 해결했지만 최종 사용자가 여전히 HTTP 504 오류를 경험하고 있는 경우에는 오리진 응답 제한 시간에 대해 배포에 지정되어 있는 시간을 변경하는 것을 반드시 고려해봐야 합니다. 자세한 내용은 응답 제한 시간(사용자 지정 오리진만 해당) 단원을 참조하십시오.