HTTP504 狀態碼 (閘道逾時) - Amazon CloudFront

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

HTTP504 狀態碼 (閘道逾時)

HTTP504 狀態碼(網關超時)表示將請求 CloudFront 轉發到來源時(因為請求的對象不在邊緣緩存中)時,會發生以下情況之一:

  • 原點將 HTTP 504 狀態碼返回到 CloudFront。

  • 原始伺服器未在請求逾期之前回應。

CloudFront 如果流量被防火牆或安全組阻止到來源,或者在互聯網上無法訪問來源,將返回 HTTP 504 狀態碼。請先查看這些問題。如果可以正常存取,請探索應用程式延遲和伺服器逾時,以協助您找出問題並進行修正。

在原始伺服器上設定防火牆以允許 CloudFront 流量

如果源服務器上的防火牆阻止了 CloudFront 流量,則 CloudFront 返回 HTTP 504 狀態碼,因此在檢查其他問題之前,最好確保該問題不是問題所在。

用於判斷防火牆是否有問題的方法,將依原始伺服器使用的系統類型而定:

  • 如果您在 Linux 伺服器上使用IPTable防火牆,您可以搜尋可協助您使用的工具和資訊IPTables。

  • 如果您在 Windows 伺服器上使用 Windows 防火牆,請參閱 Microsoft 文件中的新增或編輯防火牆規則 (英文)。

當您在原始伺服器上評估防火牆組態時,請根據發佈的 IP 位址範圍尋找封鎖來自 CloudFront 邊緣位置之流量的任何防火牆或安全規則。如需詳細資訊,請參閱 CloudFront 邊緣伺服器的位置和 IP 位址範圍

如果允許 CloudFront IP 位址範圍連線到原始伺服器,請務必更新伺服器的安全規則以納入變更。您可以訂閱 Amazon SNS 主題,並在 IP 位址範圍檔案更新時收到通知。在收到通知後,您可以使用程式碼來擷取檔案及進行剖析,並為您的本機環境進行調整。如需詳細資訊,請參閱 AWS 新聞部落格SNS上透過 Amazon 訂閱 AWS 公用 IP 位址變更。

設定原始伺服器上的安全群組以允許 CloudFront 流量

如果您的來源使用 Elastic Load Balancing,請檢閱ELB安全群組,並確定安全群組允許來自的輸入流量 CloudFront。

您也可以使用自動 AWS Lambda 更新安全性群組,以允許來自的輸入流量 CloudFront。

設定您的自訂原始伺服器可從網際網路存取

如果 CloudFront 無法訪問您的自定義源服務器,因為它在互聯網上沒有公開可用,則 CloudFront 返回 HTTP 504 錯誤。

CloudFront 邊緣位置會透過網際網路連線到原始伺服器。如果您的自訂來源位於私人網路上,則 CloudFront 無法連線。因此,您無法使用私有 CloudFront伺服器 (包括內部傳統負載平衡器) 做為.

要檢查互聯網流量是否可以連接到您的原始服務器,請運行以下命令(其中 OriginDomainName 是您伺服器的網域名稱):

對於HTTPS交通:

  • 北卡羅來納-ZV OriginDomainName 443

  • 遠程網 OriginDomainName 443

對於HTTP交通:

  • 北卡羅來納-ZV OriginDomainName 80

  • 遠程網 OriginDomainName 80

尋找和修正原始伺服器上應用程式的延遲回應

導致伺服器逾時發生的原因通常是等候應用程式回應的時間過長,或是設定的逾時值過短。

幫助避免 HTTP 504 錯誤的快速修復方法是簡單地為您的發行版設置更高的 CloudFront超時值。但是,我們建議您先排除任何與應用程式和原始伺服器有關的效能和延遲問題。然後,您可以設置合理的超時值,以幫助防止 HTTP 504 錯誤並為用戶提供良好的響應能力。

以下是找出效能問題並加以更正之步驟的概觀:

  1. 測量 Web 應用程式的一般負載和高負載延遲 (回應能力)。

  2. 視需要新增其他資源,例如CPU或記憶體。採取其他步驟來解決問題,例如調校資料庫查詢以配合高負載情況。

  3. 如果需要,請調整 CloudFront 發行版的逾時值。

以下是每個步驟的詳細資訊。

測量一般負載和高負載延遲

若要判斷一台或多台後端 Web 應用程式伺服器是否發生高度延遲,請在每台伺服器上執行下列 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,執行類似的命令。

在測量和評估伺服器中執行應用程式的延遲情況時,請注意以下資訊:

  • 延遲值會因應每個應用程式而有不同。不過,相對於幾秒鐘或更久時間,幾毫秒的第一個位元組的時間才算正常。

  • 如果在一般負載時測出的應用程式延遲時間正常,這時應注意檢視器在高負載情況下仍然可能遇到逾時問題。當出現高需求量時,伺服器可能會延遲回應或毫無回應。為了避免高負載延遲問題,請檢查伺服器的資源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 命令傳回的 Time to First Byte 值看似很高,請採取適當步驟以提升應用程式的效能。提升應用程式回應能力將有助於減少逾時錯誤。

  • 調校資料庫查詢以確保其可處理大量請求,且不會降低效能。

  • 在您的後端伺服器上設定 keep-alive (persistent) (保持活動 (持續)) 連線。當伺服器必須為後續請求或使用者重新建立連線時,此選項可避免此時發生延遲。

  • 如果您使用 Elastic Load Balancing 作為來源,則導致 504 錯誤的可能原因如下:

    • 在連線逾時到期 (10 秒) 之前,負載平衡器無法建立與目標的連線。

    • 負載平衡器會建立與目標的連線,但目標在閒置逾時期間結束之前不會回應。

    • 子網路的網路存取控制清單 (ACL) 不允許從目標到暫時連接埠 (1024-65535) 上的負載平衡器節點的流量。

    • 目標傳回的內容長度標頭大於實體主體。負載平衡器逾時等待遺失的位元組。

    • 目標是 Lambda 函數,Lambda 在連線逾時到期之前不會回應。

    如需有關降低延遲的詳細資訊,請參閱如何疑難排解 C ELB lassic Load Balancer 的高延遲?

  • 如果您使用 MediaTailor 作為來源,則導致 504 錯誤的可能原因如下:

    • 如果親戚URLs處理不當, MediaTailor 可以從玩家那裡接收不正確的格式URLs。

    • 如果 MediaPackage 是清單來源 MediaTailor,則 MediaPackage 404 清單錯誤可能會導 MediaTailor 致返回 504 錯誤。

    • 對 MediaTailor 原始伺服器的要求需要 2 秒以上的時間才能完成。

  • 如果您使用 Amazon API 網關作為您的來源,則以下是 504 錯誤的可能原因:

如有需要,請調整 CloudFront 逾時值

如果您已評估並解決緩慢的應用程式效能、原始伺服器容量和其他問題,但是檢視者仍然遇到 HTTP 504 個錯誤,則您應該考慮變更發行版中指定的時間以進行來源回應逾時。如需詳細資訊,請參閱回應逾時 (僅限自訂原始伺服器)