1

我正在使用独立的 FastCGI 服务器和 FastCgiExternalServer 指令在 Apache2 中为我的 FastCGI 应用程序提供服务。

当我重新启动我的 FastCGI 应用程序时,我的用户会收到 500 错误。我能做些什么来防止这种情况发生?我想向他们展示一个不错的“维护”页面或其他内容。

这是一个用 perl 编写的 Catalyst 应用程序,我按照这里的示例进行操作,但我发现提供了 500 而不是 502 错误网关,因此我无法选择要显示的错误。我不想为合法的内部服务器错误提供维护页面。

4

2 回答 2

2

你唯一真正的选择是

  1. 使用ErrorDocument 500和设计适合任何一种情况的页面,或者
  2. 破解/修复 mod_fastcgi 以返回 502 而不是像民间智慧认为的那样返回 500。

mod_fastcgi 开发速度很慢,但还没有完全死掉,所以你总是可以尝试将补丁发送到上游;如果它被接受,将不胜感激。:)

于 2009-11-06T04:50:38.870 回答
1

谢谢霍布斯,

我接受了您的建议并创建了一个补丁文件。这对我有用。我知道这是一个老问题,但它帮助了我,希望这对其他人有帮助。

--- 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)))
     {
于 2012-06-01T16:59:30.843 回答