在 Ubuntu 系统中,将 Apache 的 PHP 运行模式从 mod_php 切换到 PHP-FPM 是一个标准的操作流程。Ubuntu 提供了 a2enmod 和 a2enconf 等工具,使得这个过程非常简单。
以下是详细的操作步骤:
首先,你需要知道你安装的是哪个版本的 PHP(例如 8.1, 8.2 或 8.3),因为命令中需要包含版本号。
php -v
假设你的版本显示是“PHP 8.1.2-1”那下面的版本号就是 8.1。
如果尚未安装 FPM 组件,请先安装:
sudo apt update sudo apt install php8.1-fpm
PHP-FPM 需要通过 FastCGI 协议与 Apache 通信,因此需要开启代理模块:
sudo a2enmod proxy_fcgi setenvif
Ubuntu 的 PHP 安装包自带了针对 Apache 的 FPM 配置文件,直接启用即可:
# 将 8.x 替换为你实际的版本号 sudo a2enconf php8.x-fpm
为了避免冲突,必须关闭原有的 PHP 模块:
# 将 8.x 替换为你实际的版本号 sudo a2dismod php8.x
这是最关键的一步:
mod_php 必须使用 prefork 模式(性能较低,不支持多线程)。
PHP-FPM 推荐使用 event 模式(高并发性能极佳)。
执行以下命令切换:
sudo a2dismod mpm_prefork sudo a2enmod mpm_event
重启 Apache 和 PHP-FPM 使配置生效:
sudo systemctl restart apache2 sudo systemctl restart php8.x-fpm
命令行验证:
sudo systemctl status php8.x-fpm
确认状态为 active (running)。
浏览器验证: 创建一个 info.php 文件:
<?php phpinfo(); ?>
访问该页面,搜索 Server API。如果看到 FPM/FastCGI,则说明切换成功。
.htaccess 兼容性问题: 切换到 PHP-FPM 后,你在 .htaccess 文件中写的 php_value 或 php_flag 指令会导致网站出现 500 错误(Internal Server Error)。
解决方法: 将这些配置移动到 /etc/php/8.x/fpm/php.ini 文件中,或者在 FPM 的池配置文件(如 /etc/php/8.x/fpm/pool.d/www.conf)中设置。
权限差异: 在 mod_php 模式下,PHP 运行在 apache 进程内。切换到 PHP-FPM 后,PHP 运行在独立的 php-fpm 进程下。虽然默认用户通常都是 www-data,但如果你之前有特殊的权限设置,请确保网页目录对 www-data 用户有正确的读写权限。
连接方式: Ubuntu 默认通常使用 Unix Socket 通信(路径通常在 /run/php/php8.x-fpm.sock)。如果你发现 Apache 报 503 错误,请检查 /etc/apache2/conf-enabled/php8.x-fpm.conf 中的 Socket 路径是否与 /etc/php/8.x/fpm/pool.d/www.conf 中的 listen 路径一致。