我搬到了一个使用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站点
这些错误意味着脚本的运行时间超过了31秒,因此它们被终止了,正如你的fcgid.conf所说的那样。 标准超时是40秒btw。
你可以通过写一个test.php来轻松的检查这个行为:
<?php sleep(32); ?>
这应该给你一个错误500,并把这个错误在你的日志。
你有两种可能来解决这个问题:
超时设置。 这必须为每个虚拟主机完成(不要忘记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块中的设置,并将其应用到全局读取的最后一个块中 。