报错是这么冒出来的。CentOS 7.9 的 Apache 2.4 按文档切到 event MPM,重启后 httpd -V 依然显示 Server MPM: prefork,内存占用没降,静态资源并发一高就顶不住。
中间走过弯路,把「改了 conf 但没改 /etc/httpd/conf.modules.d 下的 00-mpm.conf」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。mod_php 只支持 prefork,模块还在加载,Apache 自动退回 prefork。另一种情况是conf.modules.d 里两个 MPM 配置文件同时存在,先加载的那个生效。
另外,systemd 的 httpd.service 里显式指定了 -D FOREGROUND 之外的参数,把 MPM 带回来了。
第一件事是确认当前生效的 MPM 和已加载模块
httpd -V | grep MPM && httpd -M | grep -E 'php|mpm'
再往下把 mod_php 换成 php-fpm 方式
yum remove -y php && systemctl enable --now php-fpm
只保留 event 的 MPM 配置
sed -i 's#^LoadModule mpm_prefork#\#LoadModule mpm_prefork#' /etc/httpd/conf.modules.d/00-mpm.conf
剩下的就是重启并核对进程模型
systemctl restart httpd && httpd -V | grep MPM
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
怎么算真的好了,看的是同一批现象。httpd -V 显示 Server MPM: event,ps 里只剩少量主进程和线程,静态资源压测的并发能力明显高于改动前。
event MPM 与 mod_php 不共存,必须走 php-fpm;改完要用 httpd -M 确认没有残留的 prefork 模块被加载。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
