12

500 Internal Server我在各种共享主机上的基于 PHP / MySQL 的网站上一直出现随机错误。我在共享 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:  ...

任何人都知道如何解决这个问题?

4

2 回答 2

13

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

我们需要查看您的 fcgi 包装器(/dev/shm/blackmou-php.fcgi 中的内容)或用于 FastCGI 生成的 .htaccess,以便更好地帮助您,而无需知道问题发生在哪些文件和这些文件上的代码。您的主机是否还使用 Apache、LightHttpd 或 Nginx(或组合)?那时我强烈建议更新为使用 PHP 5.3.9+

由于这可能是由任何数量的问题引起的,FastCGI 有效地防止您的站点/脚本受到拒绝服务的攻击或由于内存泄漏等而崩溃(例如:尝试通过删除和限制数量来处理 80,000 个连接)请求或因超时和终止进程而陷入无限循环)

特别是此错误通常是由 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

于 2013-10-07T23:31:52.890 回答
0

对于任何寻找更多信息的人:

就我而言,存在代码问题。在传入的 http 请求中,从代码中调用了内部 URL,从而产生了一种死锁的情况。

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

NewRelic 工具帮助我确定了需要花费大量时间来响应的功能。

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

希望这可以帮助。

于 2015-09-11T07:05:39.253 回答