VestaCP面板PHP-CGI进程过多耗尽内存问题解决

VestaCP面板对较新发布的系统支持并不理想,到现在对Ubuntu 14.04的支持只能说是勉强能正常运行,还没有得到很好的优化,而对Redhat/CentOS 7的支持则完全还没开始。在Ubuntu 14.04系统中,VestaCP面板的部分设置仍有调整优化的空间,Kaijia这次就遇到的PHP-CGI进程耗尽内存的情况就是由于配置未优化造成的。

Kaijia的VestaCP模块(Package)设置使用的是phpfcgid模板,这样可以通过PHP-CGI模块有效得实现站点间文件访问的阻隔。但这样做的代价是每个Unix用户都会拥有自己的FCGI实例,因此需要支出额外的内存。当配置失当时更会造成虽然服务器访问量低但内存接近耗尽的情况,使用htop等工具查看有如下图:

HTOP显示PHP-CGI大量进程占用内存情况

HTOP显示PHP-CGI大量进程占用内存情况

虽然Kaijia放在VestaCP服务器上的网站P/V很低,但大量的PHP-CGI进程仍然在服务器重启后数小时内基本耗尽了内存,很早之前闲置的PHP-CGI进程没有被杀死,一个进程下面运行了近20个子进程消耗了至少100M的内存。造成这一现象的原因既是VestaCP在Ubuntu的phpfcgid模板中使用了未优化的配置。

首先VestaCP在phpfcgid模板中设置了单个PHP-CGI进程最多可以运行20个子进程(见/usr/local/vesta/data/templates/web/apache2/phpfcgid.sh文件第13行):

然而这样的设置却违反了Apache在文档中给出了PHP子进程管理的警示:

PHP child process management (PHP_FCGI_CHILDREN) should always be disabled with mod_fcgid, which will only route one request at a time to application processes it has spawned; thus, any child processes created by PHP will not be used effectively. (Additionally, the PHP child processes may not be terminated properly.) By default, and with the environment variable setting PHP_FCGI_CHILDREN=0, PHP child process management is disabled.

由于在Apache的mod_fcgid模块中,单个PHP-CGI进程只能同时响应一个请求,所以运行PHP-CGI子进程是一个非常低效的行为,因此应当直接禁用PHP子进程管理,即设置:

在VestaCP中解决这个问题,首先需要修改/usr/local/vesta/data/templates/web/apache2/phpfcgid.sh文件的第13行参数为0。同时,如果有已经生成的虚拟主机,需要修改所有站点的配置文件,将/home/用户名/web/域名/cgi-bin/fcgi-starter中的:

修改为:

完成修改后mod_fcgid模式下PHP子进程管理将会关闭,PHP-CGI进程将不再生成子进程,可以节约大量内存。

其次,VestaCP没有设置有效的空闲进程杀死机制,所有新运行的PHP-CGI进程将会持续占用内存直到系统重启。解决这个问题只需要在mod_fcgid的配置文件/etc/apache2/mods-enabled/fcgid.conf中增加设置:

就可以了,FcgidIdleTimeout设置了Apache自动杀死空闲2分钟(120秒)及以上的PHP-CGI进程。

完成设置后重启Apache服务:

服务重启后htop中显示的上百个PHP-CGI进程就再也不会出现了。一般情况下单个VestaCP用户单个PHP-CGI进程消耗30~40M的内存,完全满足商业虚拟主机的需求,因此对VestaCP和模板的配置优化是不可缺少的。

© 版权声明
THE END
請多多支持
点赞0
评论 抢沙发

    暂无评论内容