Ubuntu16.04下如何阻止Apache安全更新后切换回mpm_prefork?
解决Ubuntu 16.04 Apache2更新后自动切换回mpm_prefork的问题
我之前碰到过完全一样的情况,Ubuntu的Apache2更新脚本确实会“自作主张”切换MPM,核心原因主要有这几个:
问题根源
- mod_php兼容性限制:如果你的系统装了
libapache2-mod-php(Apache模块版PHP),它只能和mpm_prefork兼容——因为mod_php是线程不安全的。Apache更新脚本检测到mod_php存在时,会自动切回prefork,否则PHP会直接失效。 - 更新脚本的自动检测逻辑:Ubuntu的
apache2包自带的postinst脚本在更新时会扫描MPM配置,要是它判定你的启用状态“不兼容”(比如同时加载多个MPM、存在依赖冲突),就会重置MPM设置,甚至可能导致没有MPM被加载(也就是你遇到的“No MPM is configured”错误)。 - 模块启用链接被重置:更新过程中,系统可能会重新生成
/etc/apache2/mods-enabled里的符号链接,覆盖你手动设置的MPM启用状态。
分步解决方法
第一步:排查mod_php的问题
这是最常见的触发点,先确认你是否安装了mod_php:
# 查看当前加载的MPM apache2ctl -M | grep mpm # 检查是否安装了mod_php dpkg -l | grep libapache2-mod-php
如果输出里有libapache2-mod-php,必须切换到PHP-FPM才能使用mpm_event——因为mod_php和event/worker完全不兼容。
切换到PHP-FPM的操作:
# 安装PHP-FPM(Ubuntu16.04默认是PHP7.0) sudo apt-get install php7.0-fpm # 禁用mod_php sudo a2dismod php7.0 # 启用连接PHP-FPM所需的代理模块 sudo a2enmod proxy_fcgi setenvif # 启用PHP-FPM的配置 sudo a2enconf php7.0-fpm
第二步:彻底锁定mpm_event的启用状态
现在确保禁用其他MPM,强制启用event:
# 禁用prefork和worker(如果之前启用过) sudo a2dismod mpm_prefork mpm_worker # 启用mpm_event sudo a2enmod mpm_event
第三步:防止更新脚本重置配置
为了避免更新时脚本再次篡改MPM设置,我们可以创建一个高优先级的配置文件强制加载mpm_event:
- 创建配置文件:
sudo nano /etc/apache2/conf-available/force-mpm-event.conf
- 写入以下内容:
# 强制加载mpm_event,防止更新时被切换 <IfModule !mpm_event_module> LoadModule mpm_event_module /usr/lib/apache2/modules/mod_mpm_event.so </IfModule>
- 启用这个配置:
sudo a2enconf force-mpm-event
第四步:修复“No MPM is configured”错误
如果已经出现这个错误,先检查MPM模块的启用状态:
ls -l /etc/apache2/mods-enabled/mpm*
正常情况下应该只有mpm_event.conf和mpm_event.load的符号链接。如果没有,手动创建:
sudo ln -s /etc/apache2/mods-available/mpm_event.conf /etc/apache2/mods-enabled/ sudo ln -s /etc/apache2/mods-available/mpm_event.load /etc/apache2/mods-enabled/
然后重启Apache:
sudo systemctl restart apache2
第五步:验证配置是否生效
重启后检查MPM状态:
apache2ctl -M | grep mpm
输出应该显示mpm_event_module (shared),同时查看Apache运行状态:
sudo systemctl status apache2
额外提示
- 不要用
dpkg --set-selections apache2 hold锁定Apache包更新——这会让你错过重要的安全补丁,得不偿失。 - 如果更新后还是出问题,查看Apache错误日志找线索:
sudo tail -20 /var/log/apache2/error.log
日志里会明确告诉你哪个模块冲突或者配置出错。
内容的提问来源于stack exchange,提问作者Burner
相关产品推荐
相关产品推荐

