2009-11-05 9 views
1

Je suis au service de mon application FastCGI dans Apache2 en utilisant le serveur FastCGI autonome et la directive FastCgiExternalServer. Lorsque je redémarre mon application FastCGI, mes utilisateurs reçoivent une erreur 500. Que puis-je faire pour éviter cela? Je veux leur montrer une belle page de «maintenance» ou quelque chose comme ça. C'est une application Catalyst écrite en Perl et j'ai suivi l'exemple here mais j'ai trouvé qu'un 500 est servi et pas une mauvaise passerelle 502 donc je ne peux pas sélectionner quelle erreur afficher. Je ne veux pas diffuser une page de maintenance pour une erreur de serveur interne légitime.Comment puis-je afficher une page de maintenance lorsque mon application FastCGI redémarre?

Répondre

2

Vos seuls choix réels sont

  1. Utilisez ErrorDocument 500 et concevoir une page qui convient à l'autre situation, ou
  2. Hack/fix mod_fastcgi pour revenir un 502 au lieu de 500 comme la sagesse populaire pense qu'il devrait .

Le développement de mod_fastcgi est très lent, mais pas complètement mort, donc vous pouvez toujours essayer d'envoyer ce patch en amont; Si cela était accepté, cela serait apprécié. :)

+0

Je pensais autant. Cela peut fonctionner car je pense que je peux utiliser Catalyst pour capturer les erreurs d'application et afficher une page d'erreur plus appropriée. – cubabit

1

Merci Hobbs,

J'ai pris vos conseils et créé un fichier de patch. Cela fonctionne pour moi. Je sais que c'est une vieille question, mais cela m'a aidé, j'espère que cela aidera les autres.

--- mod_fastcgi-SNAP-0910052141/mod_fastcgi.c 2008-11-09 07:31:03.000000000 -0700 
+++ mod_fastcgi-SNAP-BadGateway/mod_fastcgi.c 2012-06-01 10:42:48.497212761 -0600 
@@ -1670,7 +1670,7 @@ 
       if (open_connection_to_fs(fr) != FCGI_OK) 
       { 
        ap_kill_timeout(r); 
-     return HTTP_INTERNAL_SERVER_ERROR; 
+     return HTTP_BAD_GATEWAY; 
       } 

       is_connected = 1; 
@@ -2079,7 +2079,7 @@ 
       if (open_connection_to_fs(fr) != FCGI_OK) 
       { 
        ap_kill_timeout(r); 
-     return HTTP_INTERNAL_SERVER_ERROR; 
+     return HTTP_BAD_GATEWAY; 
       } 

       set_nonblocking(fr, TRUE); 
@@ -2387,6 +2387,11 @@ 
    { 
     sink_client_data(fr); 
    } 
+  
+ //if we failed to connect to FastCGI Server, return error now. Do not try to parse headers 
+ if (rv == HTTP_BAD_GATEWAY) { 
+  return rv; 
+ } 

    while (rv == 0 && (BufferLength(fr->serverInputBuffer) || BufferLength(fr->clientOutputBuffer))) 
    {