mod_fcgid:读取数据超时错误

我搬到了一个使用fcgid的非托pipe服务器(在我使用mod_php之前),并且在错误日志中我看到了很多这样的错误:

[Mon Apr 23 21:17:12 2012] [warn] [client 66.249.68.233] mod_fcgid:读取数据在31秒内超时[Mon Apr 23 21:17:12 2012] [error] [client 66.249.68.233]提前结束脚本头文件:index.php

[Mon Apr 23 17:59:51 2012] [warn] [client 74.117.180.58] mod_fcgid:在31秒内读取数据超时[Mon Apr 23 17:59:51 2012] [warn] [client 74.117.180.58](110 )连接超时:mod_fcgid:ap_pass_brigade在handle_request_ipc函数中失败

当备份期间负载较高(2-3)时,似乎还有更多这样的情况出现,而且我甚至在备份过程中运行tar / mysqldump的时候,在加载3的时候设法复制了这个消息(用户在看到500错误消息之后30秒)。 服务器是否可以超载? 这个问题似乎是相关的PHP + Fcgid挂起,如果下载中断,但不一样。

这是一个顶尖的服务器,我很惊讶,这将是太多了。 以下是一些规格:Webmin的6-7 Drupal站点

  • 英特尔®酷睿™i7-2600四核处理器 超线程技术
  • 内存16 GB DDR3内存
  • 硬盘2 x 3 TB SATA 6 Gb / s硬盘7200转(软件RAID 1)
  • NIC1 Gbit OnBoard以100 Mbit连接

这些错误意味着脚本的运行时间超过了31秒,因此它们被终止了,正如你的fcgid.conf所说的那样。 标准超时是40秒btw。

你可以通过写一个test.php来轻松的检查这个行为:

<?php sleep(32); ?> 

这应该给你一个错误500,并把这个错误在你的日志。

你有两种可能来解决这个问题:

  1. 重新做你的index.php(或应用程序后面),并解决潜在的循环问题(脚本永远运行,并在31秒后终止)。
  2. 超时设置。 这必须为每个虚拟主机完成(不要忘记SSL!),因为每当另一个虚拟主机加载时,这个设置都会改变,直到产生的进程死亡。
    最简单的方法是编辑/etc/apache2/mods-available/fcgid.conf 。 这是我们正在使用的:

    IdleTimeout 3600
    ProcessLifeTime 7200
    IPCConnectTimeout 8
    IPCCommTimeout 600
    BusyTimeout 300

编辑:哦,第二个错误是与URL中过长的查询string有关。 为了允许更长的查询string,还可以编辑fcgid.conf并插入

 MaxRequestLen 15728640 

不要忘记重新启动apache来终止所有正在运行的进程,以便获得新的configuration。

默认情况下mysqldump会在数据库运行时写入locking数据,所以在备份过程中数据不会被改变,这可能会导致损坏。 Drupal在每个请求中写入数据库,所以在mysqldump运行时请求会挂起,最终超时。

如果您使用的是InnoDB(或可以转换成它),那么您可以使用Percona XtraBackup进行热备份。 简而言之,不要将mysqldump传给tar或gzip; 转储.sql文件,然后在mysqldump完成(并释放locking)后在其上运行tar / gzip。

另外请注意,在fcgid的某些版本中,有一个错误会导致它只应用VirtualHost块中的设置,并将其应用到全局读取的最后一个块中 。