VestaCP 的WEB服务 选择 “phpfcgid” 模板后,大量的PHP-CGI进程,造成内存很快被耗光:
- 重新启动服务器的几个小时内,基本上一直处于内存不足的状态。
- 之前空闲的PHP-CGI进程没有被杀死,1个进程运行近20个子进程,消耗至少100M的内存。
SSH 中使用 htop
命令(需安装),可查看到此状态 ▼
如果你在使用 htop 命令时,出现错误提示 “-bash: htop: command not found”,解决方法请看这篇教程 ▼
大量的PHP-CGI进程,造成内存很快被耗光,问题就出在VestaCP在CentOS的phpfcgid模板中,使用了未优化的配置。
- VestaCP在phpfcgid模板中,设置1个PHP-CGI进程可以运行最多20个子进程。
请参阅 /usr/local/vesta/data/templates/web/httpd/phpfcgid.sh
文件的第13行:
export PHP_FCGI_CHILDREN=20
但是,这样的设置违反了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子进程管理的设置 ▼
PHP_FCGI_CHILDREN=0
同时,如果你已经有生成的虚拟主机,则需要修改所有网站的配置文件 ▼
/home/用户名/web/域名/cgi-bin/fcgi-starter
打开 fcgi-starter 配置文件后,将以下内容▼
export PHP_FCGI_CHILDREN=20
修改成 ▼
export PHP_FCGI_CHILDREN=0
- 修改后,PHP子进程管理将以mod_fcgid模式关闭。
- PHP-CGI进程将不再生成子进程,这可以节省大量内存。
还有,VestaCP 没有设置闲置进程的终止机制:
- 所有新执行的PHP-CGI进程将继续使用内存,直到系统重新启动。
要解决这个问题,只需在mod_fcgid配置文件 /etc/httpd/conf.d/fcgid.conf
中添加以下设置 ▼
FcgidIdleTimeout 120
- 将Apache设置为自动终止闲置2分钟(120秒)的PHP-CGI进程。
设置完成后,重新启动Apache服务 ▼
service httpd restart
在服务重新启动后,之前HTOP中显示的数百个PHP-CGI进程将不再显示。
通常,单个Vesta CP用户的单个PHP-CGI进程消耗30至40M内存,完全满足Linux主机的需求。
因此,网络营销人想要做好SEO,对Vesta CP和模板的配置优化非常重要 ^_^
可以看看以下VestaCP面板的相关教程 ▼
希望陈沩亮博客( https://www.chenweiliang.com/ ) 分享的《优化VestaCP phpfcgid模板配置进程多内存耗尽500错误》,对您有帮助。
欢迎分享本文链接:https://www.chenweiliang.com/cwl-735.html
喜欢就分享和按赞!您的分享和按赞,是我们持续的动力!