HTTP 504-Statuscode (Gateway Timeout) - Amazon CloudFront

HTTP 504-Statuscode (Gateway Timeout)

Ein HTTP-Statuscode 504 (Gateway Timeout) gibt an, dass eines der folgenden Ereignisse eintritt, wenn CloudFront eine Anforderung an den Ursprung weitergeleitet hat (da sich das angeforderte Objekt nicht im Edge-Cache befand):

  • Der Ursprung gab einen HTTP-Statuscode 504 an CloudFront zurück.

  • Der Ursprung reagierte nicht, bevor die Anfrage ablief.

CloudFront gibt einen HTTP-Statuscode 504 zurück, wenn Datenverkehr an den Ursprung durch eine Firewall oder Sicherheitsgruppe blockiert ist oder wenn über das Internet nicht auf den Ursprung zugegriffen werden kann. Überprüfen Sie diese Punkte zuerst. Wenn der Zugriff nicht das Problem ist, sehen Sie sich Anwendungsverzögerungen und Server-Timeouts an, um die Probleme zu ermitteln und zu beheben.

Konfigurieren der Firewall auf Ihrem Ursprungsserver, um CloudFront-Datenverkehr zuzulassen

Wenn die Firewall auf Ihrem Ursprungs-Server CloudFront-Datenverkehr blockiert, gibt CloudFront einen HTTP-Statuscode 504 zurück. Daher empfiehlt es sich, dieses Problem auszuschließen, bevor Sie andere Probleme in Betracht ziehen.

Die Methode, die Sie nutzen, um zu bestimmen, ob es sich um ein Problem mit Ihrer Firewall handelt, hängt davon ab, welches System Ihr Ursprungs-Server verwendet:

  • Wenn Sie eine IPTable-Firewall auf einem Linux-Server verwenden, suchen Sie Tools und Informationen, die Sie bei der Arbeit mit IPTables unterstützen.

  • Wenn Sie die Windows-Firewall auf einem Windows-Server verwenden, finden Sie weitere Informationen unter Hinzufügen oder Bearbeiten einer Firewallregel in der Microsoft-Dokumentation.

Wenn Sie die Firewall-Konfiguration auf dem Ursprungs-Server prüfen, suchen Sie nach Firewalls oder Sicherheitsregeln, die den Datenverkehr von CloudFront-Edge-Standorten blockieren, basierend auf dem veröffentlichten IP-Adressbereich.

Wenn der CloudFront-IP-Adressbereich auf dem Ursprungsserver erlaubt ist, stellen Sie sicher, dass Sie die Sicherheitsregeln Ihres Servers aktualisieren, um Änderungen zu berücksichtigen. Sie können ein Amazon-SNS-Thema abonnieren und Benachrichtigungen erhalten, wenn die IP-Adressbereichsdatei aktualisiert wird. Nachdem Sie die Benachrichtigung erhalten haben, können Sie Code verwenden, um die Datei abzurufen, sie zu analysieren und ggf. Anpassungen Ihrer lokalen Umgebung vorzunehmen. Weitere Informationen finden Sie unter Abonnieren von Änderungen der öffentlichen AWS-IP-Adresse über Amazon SNS im AWS News Blog.

Konfigurieren der Sicherheitsgruppen auf Ihrem Ursprungsserver, um CloudFront-Datenverkehr zu erlauben

Wenn Ihr Ursprung Elastic Load Balancing verwendet, überprüfen Sie die ELB-Sicherheitsgruppen und vergewissern Sie sich, dass die Sicherheitsgruppen eingehenden Datenverkehr von CloudFront zulassen.

Sie können auch AWS Lambda verwenden, um Ihre Sicherheitsgruppen automatisch zu aktualisieren, damit eingehender Datenverkehr von CloudFront zugelassen wird.

Erlauben des Zugriffs auf Ihren benutzerdefinierten Ursprungsserver über das Internet

Wenn CloudFront nicht auf Ihren benutzerdefinierten Ursprungs-Server zugreifen kann, weil dieser im Internet nicht öffentlich verfügbar ist, gibt CloudFront einen HTTP-Fehler 504 zurück.

CloudFront-Edge-Standorte stellen über das Internet Verbindungen zu Ursprungs-Servern her. Wenn sich Ihr benutzerdefinierter Ursprung in einem privaten Netzwerk befindet, ist er für CloudFront nicht erreichbar. Daher können Sie keine privaten Server, einschließlich interner Classic Load Balancer als Ursprungs-Server mit CloudFront verwenden.

Führen Sie die folgenden Befehl aus, um zu prüfen, ob der Internetdatenverkehr eine Verbindung mit Ihrem Ursprungs-Server herstellen kann (wobei OriginDomainName der Domänenname Ihres Servers ist):

Für HTTPS-Datenverkehr:

  • nc -zv OriginDomainName 443

  • telnet OriginDomainName 443

Für HTTP-Datenverkehr:

  • nc -zv OriginDomainName 80

  • telnet OriginDomainName 80

Suchen und Beheben verzögerter Antworten von Anwendungen auf Ihrem Ursprungsserver

Server-Timeouts sind häufig das Ergebnis einer Anwendung, die recht lange braucht, um zu reagieren, oder eines Timeout-Werts, der zu niedrig eingestellt ist.

Eine schnelle Abhilfe zum Vermeiden des HTTP-Fehlers 504 besteht darin, einen höheren CloudFront-Timeout-Wert für Ihre Verteilung festzulegen. Wir empfehlen jedoch, dass Sie zunächst sicherstellen, dass Sie alle Leistungs- und Latenzprobleme mit der Anwendung und dem Ursprungs-Server beheben. Anschließend können Sie einen angemessenen Timeout-Wert festlegen, der zur Vermeidung des HTTP-Fehlers 504 beiträgt und eine gute Reaktionsfähigkeit für Benutzer bietet.

Im Folgenden finden Sie eine Übersicht über die Schritte, die Sie ausführen können, um Leistungsprobleme zu ermitteln und zu beheben:

  1. Messen Sie die normale Latenz und die Latenz bei hoher Last (Reaktionsfähigkeit) Ihrer Webanwendung.

  2. Fügen Sie weitere Ressourcen, z. B. CPU oder Speicher (bei Bedarf) hinzu. Führen Sie andere Schritte aus, um die Probleme zu beheben, z. B. Optimierung von Datenbankabfragen für Szenarien mit hoher Last.

  3. Passen Sie bei Bedarf den Timeout-Wert für Ihre CloudFront-Verteilung an.

Im Folgenden finden Sie Details zu jedem einzelnen Schritt.

Messen der normalen Latenz und der Latenz bei hoher Last

Um festzustellen, ob auf einem oder mehreren Backend-Webanwendungsservern eine hohe Latenz vorliegt, führen Sie den folgenden Linux curl-Befehl auf jedem Server aus:

curl -w "Connect time: %{time_connect} Time to first byte: %{time_starttransfer} Total time: %{time_total} \n" -o /dev/null https://www.example.com/yourobject

Anmerkung

Wenn Sie Windows auf Ihren Servern ausführen, können Sie curl für Windows suchen und herunterladen, um einen entsprechenden Befehl auszuführen.

Beachten Sie beim Messen und Auswerten der Latenz einer Anwendung, die auf Ihrem Server ausgeführt wird, folgende Punkte:

  • Latenzwerte sind für jede Anwendung relativ. Allerdings ist eine Zeit bis zum ersten Byte in Millisekunden statt Sekunden oder mehr sinnvoll.

  • Wenn Sie die Anwendungslatenz unter normalen Lastbedingungen messen und das Ergebnis in Ordnung ist, sollten Sie daran denken, dass bei Viewern dennoch Timeouts bei hoher Last auftreten können. Wenn eine hohe Nachfrage besteht, können Server Antworten verzögert senden oder gar nicht reagieren. Zur Vermeidung von Latenzproblemen bei hoher Last überprüfen Sie Ihre Serverressourcen wie CPU, Arbeitsspeicher und Lese- und Schreibvorgänge auf Speichermedien, um sicherzustellen, dass Ihre Server über die Kapazitäten zur Skalierung für hohe Auslastung verfügen.

    Sie können den folgenden Linux-Befehl zum Überprüfen des Speichers ausführen, der von Apache-Prozessen verwendet wird:

    watch -n 1 "echo -n 'Apache Processes: ' && ps -C apache2 --no-headers | wc -l && free -m"

  • Eine hohe CPU-Auslastung auf dem Server kann die Leistung einer Anwendung erheblich reduzieren. Wenn Sie eine Amazon EC2-Instance für Ihren Backend-Server verwenden, überprüfen Sie die CloudWatch-Metriken für den Server zum Ermitteln der CPU-Auslastung. Weitere Informationen finden Sie im Amazon CloudWatch Benutzerhandbuch. Wenn Sie Ihre eigenen Server verwenden, finden Sie in der Hilfedokumentation des Servers Anleitungen zum Prüfen der CPU-Auslastung.

  • Überprüfen Sie, ob andere potenzielle Probleme unter hoher Last vorliegen, wie Datenbankabfragen, die bei einem hohen Volume von Anfragen langsam ausgeführt werden.

Hinzufügen von Ressourcen und Optimieren von Servern und Datenbanken

Nachdem Sie die Reaktionsfähigkeit Ihrer Anwendungen und Server bewertet haben, stellen Sie sicher, dass Sie über ausreichend Ressourcen für normalen Datenverkehr und Situationen mit hoher Auslastung verfügen:

  • Wenn Sie einen eigenen Server nutzen, stellen Sie basierend auf Ihrer Bewertung sicher, dass dieser über ausreichend CPU, Arbeitsspeicher und Festplattenspeicher für die Verarbeitung von Viewer-Anfragen verfügt.

  • Wenn Sie eine Amazon EC2-Instance als Backend-Server verwenden, stellen Sie sicher, dass der Instance-Typ über die Ressourcen verfügt, die für die Verarbeitung der eingehenden Anforderungen erforderlich sind. Weitere Informationen finden Sie unter Instance-Typen im Amazon-EC2-Benutzerhandbuch.

Außerdem sollten Sie ggf. die folgenden Optimierungsschritte ausführen, um Timeouts zu vermeiden:

  • Wenn der Wert für die Zeit bis zum ersten Byte, der vom curl-Befehl zurückgegeben wird, hoch erscheint, ergreifen Sie Maßnahmen zur Verbesserung der Leistung Ihrer Anwendung. Durch Verbessern der Anwendungsreaktionsfähigkeit lassen sich wiederum Timeout-Fehler reduzieren.

  • Optimieren Sie Datenbankabfragen, um sicherzustellen, dass sie hohe Abfragezahlen verarbeiten können, ohne dass die Leistung beeinträchtigt wird.

  • Richten Sie (persistente) Keepalive-Verbindungen auf Ihrem Backend-Server ein. Mit dieser Option lassen sich Latenzen vermeiden, die auftreten, wenn Verbindungen für nachfolgende Anfragen oder Benutzer erneut hergestellt werden müssen.

  • Wenn Sie ELB als Ursprung verwenden, sehen Sie sich die Vorschläge im Wissenszentrum im folgenden Artikel an, um zu erfahren, wie Sie die Latenz reduzieren können: Wie behebe ich hohe Latenz in meinem ELB Classic Load Balancer?

Bei Bedarf passen Sie den CloudFront-Timeout-Wert an.

Wenn Sie eine langsame Anwendungsleistung, Ursprungs-Serverkapazität und weitere Probleme festgestellt und behoben haben, die Viewer aber weiterhin den HTTP-Fehler 504 erhalten, sollten Sie in Betracht ziehen, die Zeit, die in Ihrer Verteilung als Ursprungs-Reaktions-Timeout angegeben ist, zu ändern. Weitere Informationen hierzu finden Sie unter Reaktions-Timeout (nur benutzerdefinierte Ursprünge).