我一直在我的基于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中)或者.htaccess for FastCGI产卵器,以便更好地帮助你,而不需要知道哪些文件和这些文件上的代码出现问题。 你的主机也使用Apache,LightHttpd或Nginx(或组合)? 在这一点上,我强烈建议更新使用PHP 5.3.9 +
由于这可能是由于许多问题引起的,FastCGI可以有效地防止您的站点/脚本受到拒绝服务攻击或者由于内存泄漏等造成的崩溃(EG:试图通过删除和限制数量来处理80,000个连接的请求或通过超时和终止进程陷入无限循环)
这个错误通常是由idle_timeout(默认30秒)或最大子进程数限制引起的。 这也可能是由某人在脚本完成之前启动长时间运行的脚本并关闭浏览器/连接引起的。
FastCGI启动它的进程包装器,执行一个命令,在完成进程之前超时,连接看起来被同级重置。
另一个例子是达到最大的孩子(maxProcesses)(EG:很多网站显示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
UPDATE
要加上这个,这也可能是由于php的内存限制造成的
如果上述不能解决你的问题,更新你的php.ini以增加memory_limit
对于任何寻找更多信息的人:
在我的情况下,有一个代码问题。 在传入的http请求中,正在从代码内部调用内部URL,从而产生死锁情况。
这导致挂起的PHP进程并将服务器关闭。 我们在回调函数中使用了file_get_contents('URL')或cURL()。 然后,我们用一个简单的drupal函数取代了它,它为我们提供了来自DB的值。
NewRelic工具帮助我确定需要花费大量时间来回答的功能。
另一种识别这种情况的方法是在回调函数上做一个drupal_watchdog,并在服务器崩溃时验证日志。
希望这可以帮助。