Bug #1295
Erreur : Premature end of script headers
0%
Description
Dans les logs d'apache, on arrive parfois sur une 500 suite à un POST (dans le backoffice) :
error.log :
[Mon Mar 05 09:19:19 2012] [error] [client 81.93.6.149] Premature end of script headers: , referer: https://meyzieu.au-quotidien.com/backoffice/remarque-suggestions-a-propos-de-ce-site/3/ [Mon Mar 05 09:19:19 2012] [error] [client 81.93.6.149] (500)Unknown error 500: scgi: error reading response headers, referer: https://meyzieu.au-quotidien.com/backoffice/remarque-suggestions-a-propos-de-ce-site/3/
access.log :
81.93.6.149 - - [05/Mar/2012:09:19:19 +0100] "POST /backoffice/remarque-suggestions-a-propos-de-ce-site/3/ HTTP/1.1" 500 1188 "https://meyzieu.au-quotidien.com/backoffice/remarque-suggestions-a-propos-de-ce-site/3/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" (163344us)
Résultat : l'utilisateur arrive sur une page "site en maintenance" (erreur 500 customisée sur l'apache de auquo).
Historique
Mis à jour par Benjamin Dauvergne il y a environ 12 ans
Il y a des exceptions qui passent entre les mailles du filet, dans quixote/server/scgi_server.py il y a ce code pour la sérialisation d'une réponse dans la connexion SCGI:
response = self.publisher.process(input, env)
try:
response.write(output)
input.close()
output.close()
conn.close()
except IOError, err:
self.publisher.log("IOError while sending response "
"ignored: %s" % err)
Si response.write(output)
génère une exception (par exemple en essayant de renvoyer un header qui a une valeur unicode, on ne la verra pas. Le patch suivant rajoute encore un niveau pour rattraper les exceptions pour surveiller un peu ça.
--- a/wcs/qommon/scgi_server.py +++ b/wcs/qommon/scgi_server.py @@ -28,7 +28,7 @@ import quixote.server.scgi_server import sessions import cron import quixote.server.simple_server as simple_server - +import traceback class QommonHandler(quixote.server.scgi_server.QuixoteHandler): connection_limit = -1 @@ -36,7 +36,22 @@ class QommonHandler(quixote.server.scgi_server.QuixoteHandler): def handle_connection(self, conn): self.number_of_connection_handled = self.number_of_connection_handled + 1 - quixote.server.scgi_server.QuixoteHandler.handle_connection(self, conn) + try: + quixote.server.scgi_server.QuixoteHandler.handle_connection(self, conn) + except Exception: + (exc_type, exc_value, tb) = sys.exc_info() + error_summary = traceback.format_exception_only(exc_type, exc_value) + error_summary = error_summary[0][0:-1] # de-listify and strip newline + plain_error_msg = self.publisher._generate_plaintext_error(None, + None, exc_type, exc_value, tb) + try: + self.publisher.logger.log_internal_error(error_summary, plain_error_msg) + except socket.error: + # will happen if there is no mail server available and exceptions + # were configured to be mailed. + pass + raise + # input, output and conn are closed, long running jobs could be done # here. self.publisher.response.process_after_jobs()
Mis à jour par Thomas Noël il y a environ 12 ans
J'ai mis le patch sur la prod (auquo), sans le commiter pour l'instant. On va voir ce que ça donne.
Mis à jour par Thomas Noël il y a environ 12 ans
- Statut changé de En cours à Rejeté
A priori le max_children a corrigé le problème des erreurs 500... on ne va pas commiter ce patch (pour l'instant)...
Mis à jour par Benjamin Dauvergne il y a environ 12 ans
Je pense que ne pas perdre des exception c'est assez important quand même, en général ça fait gagner du temps :) Maintenant on peut s'accorder qu'il serait bien de factoriser le code qui transforme les exceptions en mail plutôt que de le recopier.