我在1GB的单核VPS上运行Nginx 1.5.1和PHP-FPM(PHP 5.3.26)的Drupal 6,SSD存储上有3GB的交换空间。 我刚刚从共享主机切换到这个非托pipe的VPS,因为我的网站变得太重了,所以我仍然在学习绳索。 我有很高的stream量,我没有真正注意到,但谷歌Adsense通常每天接近30K页面浏览量。 我通常有50到80个经过身份validation的用户login,另外还有几百个匿名用户在任何特定时间点击Boost静态HTMLcaching。
我遇到的问题是PHP-FPM经常停止响应,导致Nginx 502或504错误。 我发誓,我已经阅读了互联网上关于这个问题的每一页,这似乎相当普遍,我已经尝试了无数的configuration组合,我找不到一个好的解决scheme。 重新启动Nginx和PHP-FPM后,网站运行得非常快,然后没有任何警告就停止响应。 当浏览器在服务器上等待时,我得到一个白色的屏幕,大约30秒到一分钟后,它会抛出一个Nginx的502或504错误。 有时运行2分钟,有时5分钟,有时5小时,但总是挂起来。 当我发现服务器处于这种状态时,仍然有足够的空闲内存(> 500MB或更多)并且没有主要的CPU使用,控制和工人PHP-FPM进程仍然存在,并且服务器仍然可以通过SSH进行ping命令和使用。 通过初始化脚本重新载入PHP-FPM会再次激活它。 hangups似乎不符合stream量,因为我在一个没有stream量的开发VPS上testing这个configuration时一直观察到这种行为。
我一直在不断调整设置,但我不能确定地消除这个问题。 我将Nginx的工作者设置为1.在PHP-FPMconfiguration中,我尝试了所有三个进程pipe理器。 “dynamic”绝对是最不可靠的,只有几分钟后才会持续挂断。 “静态”也是不可靠和不可预测的。 最less的马车已经“非常需要”了,但是即使这样也会让我失望,有时甚至会在12到24小时之后。 但是我不能离开服务器,因为PHP-FPM死了,永远不会自动返回。 我试着将pm.max_children的值从3调整到50,并没有太大的差别,但是我现在是10。 我也设置pm.max_requests从30到无限的任何地方,似乎没有什么区别。
我也一直在使用APC和Rediscaching来从数据库中取出一些负载,但是在使用和不使用这些机制的情况下都存在PHP-FPM问题。
根据日志,PHP-FPM进程不是用SIGSEGV或SIGBUS退出,而是用SIGTERM。 我得到了很多行:
WARNING: [pool www] child 3739, script '/var/www/drupal6/index.php' (request: "GET /index.php") execution timed out (38.739494 sec), terminating
和:
WARNING: [pool www] child 3738 exited on signal 15 (SIGTERM) after 50.004380 seconds from start
实际上,我发现了几篇文章,build议通过每隔几分钟或几小时通过cron优雅地重新装载PHP-FPM来规避此问题。 这就是我所做的,每5分钟“/etc/init.d/php-fpm重新加载”。 到目前为止,它保持着灯光。 但感觉像是一个可怕的黑客。 PHP-FPM真的不可靠吗? 还有什么我可以做的吗? 非常感谢!
你有没有尝试过另一个优化器,或者你尝试使用apc.filter? 这听起来像一个APC相关的问题,因为APC的稳定性总是取决于使用的代码和APCconfiguration。
通过谷歌来到这里,分享一些经验。
有同样的问题,但在Drupal 7! (对不起@迈克尔·汉普顿;-) Drupal 6在相同的VPS(2048 MB,2×2.4Ghz@60%,NGINX,APC)上运行良好。 Drupal 7在~4小时之后就会陷入困境,就像堵车或者什么东西;-) 2个星期我正在尝试和search不同的选项。
看来,最终禁用APC的伎俩。 在(APC on)之前,Drupal中的CRON在slowlog中给出了一个错误。 没有APC,该网站似乎更快一点。