PHP-CGI进程创建时机及原因咨询——生产服务器OOM问题排查
问题:PHP-CGI进程的创建时机与原因

我的生产服务器出现OOM(内存耗尽)问题,排查后发现主要内存占用来自PHP-CGI进程。旗下每个Joomla或WordPress站点都会生成3-6个PHP-CGI进程,每个进程占用约80MB内存。
为排查问题,我搭建了全新测试服务器,迁移了一个仅安装Astra、Elementor等少量常用插件的最简WordPress站点——未修改配置、未指向A记录,也无访客或爬虫访问。但截图显示该新站点(kcmc)仍创建了3个php-cgi进程,而另一台仅部署1个生产Joomla站点的服务器仅生成1个该进程。
由此提出疑问:PHP-CGI进程何时、为何会被创建?
更新:Apache服务器配置
<Directory /home/kcmc/public_html> Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch +ExecCGI allow from all AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch Require all granted AddType application/x-httpd-php .php AddHandler fcgid-script .php AddHandler fcgid-script .php7.4 AddHandler fcgid-script .php8.1 FCGIWrapper /home/kcmc/fcgi-bin/php8.1.fcgi .php FCGIWrapper /home/kcmc/fcgi-bin/php7.4.fcgi .php7.4 FCGIWrapper /home/kcmc/fcgi-bin/php8.1.fcgi .php8.1 </Directory> <Directory /home/kcmc/cgi-bin> allow from all AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch Require all granted </Directory> RewriteEngine on RewriteCond %{HTTP_HOST} =webmail.kcmc.com RewriteRule ^(?!/.well-known)(.*) https://kcmc.com:20000/ [R] RewriteCond %{HTTP_HOST} =admin.kcmc.com RewriteRule ^(?!/.well-known)(.*) https://kcmc.com:10000/ [R] RemoveHandler .php RemoveHandler .php7.4 RemoveHandler .php8.1 FcgidMaxRequestLen 1073741824 SSLEngine on SSLCertificateFile /home/kcmc/ssl.cert SSLCertificateKeyFile /home/kcmc/ssl.key SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 IPCCommTimeout 31
PHP-CGI进程的创建时机与原因
从你的配置来看,服务器采用Apache + mod_fcgid运行PHP,PHP-CGI进程的创建逻辑由mod_fcgid的参数控制,主要分为两种场景:
1. 预创建(进程池预热)
mod_fcgid会根据配置提前创建一定数量的PHP-CGI进程,即使没有外部请求也会维持这个基础进程数——这就是测试站点无流量却有3个进程的核心原因。
- 控制该行为的核心参数是
FcgidMinProcessesPerClass,默认值通常为1,但如果全局配置中将其设为3,就会为每个站点(对应每个FCGIWrapper的进程类)预创建3个进程。 - 另一台Joomla服务器仅生成1个进程,大概率是其
FcgidMinProcessesPerClass保持默认值1,或站点的进程类配置存在差异。
2. 按需创建(应对请求负载)
当现有进程无法处理并发请求时,mod_fcgid会自动创建新的PHP-CGI进程:
- 若站点突然涌入大量请求,当前进程全部处于忙碌状态,mod_fcgid会检查
FcgidMaxProcessesPerClass(单站点最大进程数)和FcgidMaxProcesses(全局最大进程数),未达上限则新建进程。 - 请求处理完成后,空闲进程不会立即销毁,会在
FcgidIdleTimeout设置的时长内保持存活以等待新请求,超时后才会被回收。
额外触发因素
- 站点后台任务:即使无外部访客,WordPress的定时任务(如插件更新检查、缓存清理)、Elementor的后台预渲染等操作,也可能触发PHP-CGI进程启动。
- 内部健康检查:部分控制面板或监控工具会定期访问站点PHP文件(如
wp-cron.php),间接触发进程创建。 - FCGIWrapper配置差异:测试站点与Joomla站点的FCGIWrapper配置(如PHP版本、权限设置)不同,也可能导致进程池初始大小不一致。
排查建议
- 查看Apache全局mod_fcgid配置文件(通常路径为
/etc/httpd/conf.d/fcgid.conf),重点检查:FcgidMinProcessesPerClass:单站点最小预创建进程数FcgidMaxProcessesPerClass:单站点最大进程数FcgidIdleTimeout:空闲进程存活时间
- 测试禁用WordPress定时任务(在
wp-config.php中添加define('DISABLE_WP_CRON', true);),验证是否为后台任务触发进程创建。 - 对比两台服务器的mod_fcgid全局配置,定位进程数差异的原因。
内容的提问来源于stack exchange,提问作者shenkwen
相关产品推荐
相关产品推荐

