随机PHP FastCGI/由对等/不完整标头重置连接


Random PHP FastCGI / Connection reset by peer / incomplete headers

我在各种共享主机上基于PHP/MySQL的网站上出现了随机的500 Internal Server错误。我在共享的Linux服务器上通过CGI/FastCGI使用PHP 5.2.17。当我查看日志时,我看到的是:

[error] [client 75.71.176.224] (104)Connection reset by peer: FastCGI: comm with server "/dev/shm/blackmou-php.fcgi" aborted: read failed, referer: ...
[error] [client 75.71.176.224] FastCGI: incomplete headers (0 bytes) received from server "/dev/shm/blackmou-php.fcgi", referer:  ...
[error] [client 75.71.176.224] (104)Connection reset by peer: FastCGI: comm with server "/dev/shm/blackmou-php.fcgi" aborted: read failed, referer:  ...
[error] [client 75.71.176.224] FastCGI: incomplete headers (0 bytes) received from server "/dev/shm/blackmou-php.fcgi", referer:  ...

有人知道如何解决这个问题吗?

这个问题通常不仅仅是特定于主机的,它还与开发人员有关,具体取决于配置。然而,有些主机对FastCGI要求相当严格,会限制您的功能。不使用FastCGI通常更容易运行,只需使用mod_php,除非您有特定需要在应用程序中使用FastCGI。

我们需要查看您的fcgi包装器(/dev/shm/blackmou php.fcgi中的内容)或用于FastCGI生成的.htaccess,以便在不知道哪些文件和这些文件上的代码的情况下更好地帮助您。您的主机也使用Apache、LightHttpd或Nginx(或组合)吗?在这一点上,我强烈建议更新为使用PHP 5.3.9+

由于这可能是由许多问题引起的,FastCGI可以有效地防止您的网站/脚本受到拒绝服务攻击或因内存泄漏等原因崩溃。(例如:试图通过丢弃和限制请求数量来处理80000个连接,或者通过超时和终止进程来陷入无休止的循环)

此错误通常是由idle_timeout(默认为30秒)或最大子进程限制引起的。也可能是由于某人启动了一个长时间运行的脚本,并在脚本完成之前关闭了浏览器/连接。

FastCGI启动其进程包装器,执行命令,在完成进程之前超时,连接被对等方视为重置。

另一个例子是达到了最大子代(maxProcesses)(例如:许多网站显示2或4个作为例子,而实际上你可能需要20或50个,具体取决于平均流量)如果所有子进程当前都处于活动状态,并且进行了额外的请求/连接,则子进程仅限于maxProcesses,FastCGI不会共享活动子进程,因此它必须首先终止进程并启动新的子进程,或者根据您的配置丢弃请求。

以下是有关设置的更多信息:

http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html

http://www.fastcgi.com/drupal/node/10

包装示例

PHP_FCGI_CHILDREN=0 #no limit
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=10000
export PHP_FCGI_MAX_REQUESTS

更新

除此之外,这也可能是由php内存限制引起的

如果以上操作不能解决您的问题,请更新php.ini以增加memory_limit

对于任何想要了解更多信息的人:

在我的案例中,存在代码问题。在一个传入的http请求中,从代码中调用了一个内部URL,从而造成了一种死锁的情况。

这导致PHP进程挂起并导致服务器停机。我们在回调函数中使用了file_get_contents('URL')或cURL()。然后,我们用一个简单的drupal函数替换了它,该函数为我们提供了DB中的值。

NewRelic工具帮助我识别了需要花费大量时间才能响应的功能。

识别这一点的另一种方法是在回调函数上执行drupal_watchdog,并在服务器崩溃时验证日志。

希望这能有所帮助。