504s auf Elastic Beanstalk App bereitstellen (Benutzer -> ELB -> Elastic Beanstalk mod_wsgi)

5

Ich habe eine Python Elastic Beanstalk-App mit Lastenausgleich. Hier ist der Pfad, den eine Benutzeranforderung auf dem Weg in die Elastic Beanstalk-App nimmt:

user -> Elastic Beanstalk ELB -> Elastic Beanstalk mod_wsgi

Das Problem:

Die ersten ~ 2-4 Anfragen usernach eb deployeiner neuen App-Version erzeugen 504 Fehler von der ELB.

Nach diesen ~ 2-4 Anfragen, die 504 erzeugen, ist alles in Ordnung! 200er rundum.

Wenn die 504s passieren, schaffen es Elastic Beanstalk mod_wsgilaut Zero Requests bis zur App /var/httpd/access_log. Ich sehe die 200er erst, nachdem die ELB beschlossen hat, wieder zu arbeiten.

Dinge, die ich ausprobiert habe und die nicht funktionierten:

  1. Ich habe das Elastic Beanstalk ELBIdle Timeout auf 300 Sekunden erhöht
  2. Ich habe den Elastic Beanstalk mod_wsgiApache KeepAliveTimeoutauf 300 Sekunden erhöht , wie hier vorgeschlagen: http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ts-elb-error-message.html

Man könnte sagen: "Lebe einfach mit den 504ern!"

Das eigentliche Problem ist jedoch, dass ich in meinem Produktionssetup CloudFlarezwischen userund habe Elastic Beanstalk ELB. CloudFlare ist auf aggressiven Cache .cssund aggressive .jsDateien eingestellt, da ich MD5-Hashes an statische Datei-URLs anhänge. Wenn Anforderungen für diese wichtigen Dateien mit 504 fehlschlagen, scheint CloudFlare diese Fehler als 404-Fehler zwischenzuspeichern. Weitere Anforderungen für diese Dateien 404 unterbrechen somit die visuelle Gestaltung der Site bei jeder Bereitstellung.

Bereitstellen des Elastic Beanstalk App erneut mit der gleichen App - Version wird das CloudFlare 404 Problem beheben. Dies ist keine gute Lösung. Ich möchte CloudFlare weiterhin verwenden, da dies ein hervorragendes transparentes CDN ergibt. Daher ist es auch keine Lösung, es loszuwerden.

Es ist schwer zu glauben, dass ich mit diesem Problem allein bin, aber Google, stackoverflow / serverfault und die AWS-Foren haben keine Lösungen oder sogar ähnliche Problemberichte geliefert. Ich hoffe, dass meine Beschreibung dieses Verhaltens bei jemandem hier eine Glocke läutet. Danke im Voraus.

markplindsay
quelle
Wie sieht die Konfiguration des ELB-Integritätschecks in Bezug auf Integrität / ungesunde Anzahl und Anforderungshäufigkeit aus? Einiges davon könnte dazu beitragen, das Verhalten, das Sie sehen, zu mildern ...
Castaglia
Was @ Castaglia gesagt hat. Ich würde Ihre Einstellungen für die ELB-Integritätsprüfung überprüfen und sicherstellen, dass sie nur dann als fehlerfrei gemeldet werden, wenn sie 200 Antworten erhalten. Stellen Sie die Häufigkeit der Integritätsprüfungen auf einen relativ niedrigen Wert ein (etwa alle 5 Sekunden) und warten Sie, bis Ihre Anwendung 200 Antworten verarbeitet, bevor Sie die Instanz in Betrieb nehmen (und somit verhindern, dass Ihre Anwendung während der Bereitstellung ausfällt).
Dannosaur

Antworten:

1

Ich hatte genau das gleiche Problem, von dem ich wirklich denke, dass es ein Fehler mit dem Beanstalk-Deployer ist.

Ich habe eine Bereitstellungsrichtlinie "Rolling" mit 2 Instanzen und einer Stapelgröße von 1 verwendet, die theoretisch keine Ausfallzeiten ergeben sollte. In der Realität gibt es jedoch während eines Einsatzes immer noch einen Zeitraum von etwa 10 bis 15 Sekunden, in dem die ELB mit 504 antwortet.

Sehen Sie sich Ihre "Update and Deployments" -Einstellungen in Ihrer Beanstalk-Konfiguration an. Ich habe festgestellt, dass die Umstellung auf "Rollen mit zusätzlichem Stapel" und die Verwendung einer Stapelgröße von 100% gut funktionieren und keine Ausfallzeiten während eines Updates verursachen.

Update Oktober 2018 - Ich weiß nicht, wie lange es funktioniert hat, aber die rollenden Updates für Elastic Beanstalk funktionieren jetzt wieder ordnungsgemäß und ohne Ausfallzeiten.

Phil
quelle
0

Bei allen anderen Personen, die auf dieses Problem gestoßen sind, stellte sich heraus, dass dieses Problem möglicherweise auch auftritt, wenn Sie den Endpunkt "Integritätsprüfung" nicht ordnungsgemäß konfiguriert haben. EB wird die Server erst dann in den Lastenausgleich versetzen, wenn EB "fehlerfreie" Antworten vom Health-Check-Endpunkt erhält, der meiner Meinung nach standardmäßig nur überprüft, ob Ihr Server (nginx / apache / other für Web-Apps) reagiert, nicht Ihr Server Anwendung wird ordnungsgemäß gestartet.

In meinem Fall reagierte der eigentliche Webserver, bevor meine Flask-Anwendung vollständig ausgeführt wurde. Dies führte dazu, dass Server eingedreht wurden, bevor sie bereit waren. Ich habe einen Endpunkt in meine Flask-App eingefügt, der gerade 200 und einen JSON-Dummy-Body zurückgibt, und EB als Health-Check darauf hingewiesen. Seitdem ist alles glatt gelaufen.

Lucier
quelle