webentwicklung-frage-antwort-db.com.de

500 Fehler ohne etwas in den Apache-Protokollen

Ich entwickle derzeit eine Anwendung basierend auf flask. Es läuft einwandfrei und der Server wird manuell mit app.run() gestartet. Ich habe versucht, es jetzt durch mod_wsgi zu führen. Seltsamerweise bekomme ich einen 500-Fehler und nichts in den Protokollen. Ich habe ein bisschen nachgeforscht und hier sind meine Ergebnisse.

  • Das Einfügen einer Zeile wie print >>sys.stderr, "hello" funktioniert wie erwartet. Die Meldung wird im Fehlerprotokoll angezeigt.
  • Wenn Sie eine Methode ohne Vorlage aufrufen, funktioniert das einwandfrei. Nein 500 Fehler.
  • Die Verwendung einer einfachen Vorlage funktioniert ebenfalls gut.
  • BUTSobald ich einen Datenbankzugriff auslöst, inside die Vorlage (zum Beispiel eine Abfrage durchlaufen), erhalte ich den Fehler.

Mein Bauch sagt mir, dass es SQLAlchemy ist, das einen Fehler ausgibt, und möglicherweise verursacht eine Protokollierungskonfiguration, dass das Protokoll irgendwann in der Anwendung verworfen wird.

Außerdem verwende ich zum Testen SQLite. Soweit ich mich erinnern kann, ist dies nur von einem Thread aus zugänglich. Wenn also mod_wsgi mehr Threads erzeugt, kann dies die App beschädigen.

Ich bin etwas ratlos, weil es nur bricht und hinter mod_wsgi läuft, was auch meine Fehler zu verschlucken scheint. Was kann ich tun, um die Fehler in den Apache error_log zu sprudeln?

Als Referenz kann der Code auf diesem Github-Permalink gesehen werden.

39
exhuma

Es stellte sich heraus, dass ich nicht völlig falsch war. Die Ausnahme wurde in der Tat von der SQL-Chemie ausgelöst. Und da es standardmäßig auf stdout gestreamt wurde, ignorierte mod_wsgi es still (soweit ich das beurteilen kann).

Um meine Hauptfrage zu beantworten: Wie werden die von der WSGI-App verursachten Fehler angezeigt?

Es ist eigentlich sehr einfach. Leiten Sie Ihre Protokolle zu stderr um. Das einzige, was Sie tun müssen, ist, Ihrem WSGI-Skript Folgendes hinzuzufügen:

import logging, sys
logging.basicConfig(stream=sys.stderr)

Jetzt ist dies die banalste Protokollierungskonfiguration. Da ich noch nichts für meine Bewerbung eingerichtet habe, wird dies funktionieren. Aber ich denke, sobald die Anwendung ausgereift ist, haben Sie sowieso eine ausgefeiltere Protokollierungskonfiguration, so dass Sie dies nicht beißt.

Für schnelles und schmutziges Debugging ist dies jedoch gut.

54
exhuma

Wenn Sie dies in Ihren config.py eingeben, wird dies wesentlich dazu beitragen, Fehler bis zum Apache-Fehlerprotokoll weiterzuleiten:

PROPAGATE_EXCEPTIONS = True
0
Hidden Name

Ich hatte ein ähnliches Problem: gelegentlich "Interner Serverfehler" ohne Protokolle. Wenn Sie mod_wsgi verwenden, sollten Sie "app.run()" entfernen, da dadurch immer ein lokaler WSGI-Server gestartet wird, den wir nicht möchten, wenn wir diese Anwendung in mod_wsgi bereitstellen. Siehe docs . Ich weiß nicht, ob dies Ihr Fall ist, aber ich hoffe, dass dies helfen kann.

0
Daniel Lerch