You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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版本、权限设置)不同,也可能导致进程池初始大小不一致。

排查建议

  1. 查看Apache全局mod_fcgid配置文件(通常路径为/etc/httpd/conf.d/fcgid.conf),重点检查:
    • FcgidMinProcessesPerClass:单站点最小预创建进程数
    • FcgidMaxProcessesPerClass:单站点最大进程数
    • FcgidIdleTimeout:空闲进程存活时间
  2. 测试禁用WordPress定时任务(在wp-config.php中添加define('DISABLE_WP_CRON', true);),验证是否为后台任务触发进程创建。
  3. 对比两台服务器的mod_fcgid全局配置,定位进程数差异的原因。

内容的提问来源于stack exchange,提问作者shenkwen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:21:39