我最近从 nginx / php_fpm 迁移到了 Apache2 / mod_fcgid / PHP。这是我进行迁移的第二台服务器,但它的使用频率远低于第一台,而第一台运行良好。
问题在于它所生成的 PHP 进程。在查看mod_fcgid 文档,看来默认终止空闲进程的时间为 300 秒;我已将其更改为 20。目前,如果 300 秒有效,那就没问题了 - 但事实并非如此。它已经运行了将近一天,服务器状态显示有 12 个活动进程:
进程名称:php5 Pid 活动 空闲 访问 状态 19243 84879 14420 11 准备就绪 进程名称:php5 Pid 活动 空闲 访问 状态 20954 82143 149 22 准备就绪 20947 82149 149 22 准备就绪 20953 82143 149 13 准备就绪 进程名称:php5 Pid 活动 空闲 访问 状态 20589 82765 23644 72 准备就绪 进程名称:php5 Pid 活动 空闲 访问 状态 17663 86103 2034 117 准备就绪 进程名称:php5 Pid 活动 空闲 访问 状态 19862 83961 1976 91 准备就绪 进程名称:php5 Pid 活动 空闲 访问 状态 18495 85825 5164 18 准备就绪 进程名称:php5 Pid 活动 空闲 访问 状态 25463 75109 23948 24 准备就绪 进程名称:php5 Pid 活动 空闲 访问 状态 2466 60019 60016 2 就绪 进程名称:php5 Pid 活动 空闲 访问 状态 20729 82541 12592 23 准备就绪 进程名称:php5 Pid 活动 空闲 访问 状态 22135 80616 46361 6 准备就绪
此时 PHP 应用程序尚未提供服务 - Apache 返回 503。但是,它仍在为服务器状态模块提供服务,并且仍在为 mod_mono/Mono 2.10 应用程序提供服务。问题出在 PHP 上。
/etc/apache2/mods-available/fcgid.conf ...
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
FcgidConnectTimeout 10
FcgidMaxRequestsPerProcess 500
FcgidIdleTimeout 20
FcgidFixPathinfo 1
FcgidMaxProcesses 10
</IfModule>
(嘿 - 最大进程数也没有被尊重......)当然,fcgid.conf 在 mods-enabled 中是 smylinked。
答案1
尝试设置环境变量:
PHP_FCGI_CHILDREN=0
在你的 php 启动脚本中。
mod_fcgid 将负责生成所有需要的进程。因此实际上不需要子进程,这些子进程通常会被遗弃。