Apache使用PHP-FPM运行PHP网站

本教程在已经可用的Ubuntu Apache站点上加入PHP-FPM。Apache负责HTTP请求,FPM管理PHP进程;安装命令行php并不会自动让网站执行PHP。以下面向官方发行版包,已由宝塔或其他面板管理的站点应在原管理工具中设置。住宅云禁止建站,不适用。

先确认Apache静态访问和虚拟主机均正常;从零准备时先完成Apache静态站点部署,已有正式环境只核对对应条件,不重复安装或覆盖旧配置。

确认站点与PHP接入方式

sudo apache2ctl -S
sudo apache2ctl -M
systemctl status php8.3-fpm --no-pager

先确认目标站点文件,以及是否已经加载另一套PHP模块或处理规则。现有站点使用mod_php且正在生产运行时,不在同一教程中随意切换MPM和处理方式,应先在测试环境完成兼容验证。本文假设Apache没有现存PHP处理器。

安装FPM并启用对应模块

sudo apt update
sudo apt install php8.3-fpm php8.3-mysql
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.3-fpm
systemctl is-active php8.3-fpm
ls -l /run/php/

a2enconf启用Ubuntu包提供的FPM处理配置,不需要同时再手写第二套FilesMatch。若命令找不到php8.3-fpm配置文件,应检查软件安装来源和版本,不把其他系统的路径拼到当前服务器。FPM通常使用本机Unix套接字,数据库和9000端口不需要因此开放到公网。

sudo apache2ctl configtest
sudo systemctl reload apache2

只有Syntax OK才加载。mod_proxy_fcgi只负责转发,不能代替FPM进程启动;Apache正常但FPM未运行,PHP页面仍会失败。

在新测试文件中核对Web端

把下面路径替换成目标虚拟主机的真实DocumentRoot,并使用尚未存在的测试文件名:

printf '%s\n' '<?php header("Content-Type: text/plain; charset=utf-8"); echo "PHP OK\n", PHP_VERSION, "\n", PHP_SAPI, "\n";' | sudo tee /var/www/apache-demo/baole-php-check.php
curl --resolve example.com:80:127.0.0.1 http://example.com/baole-php-check.php

成功应显示PHP OK、实际8.3版本及fpm-fcgi。若下载或直接显示PHP源代码,先暂停该动态站点对外访问,确认处理器真正生效后再放置含数据库凭据的程序。验证完毕删除本次测试文件,不公开完整phpinfo页面。

常见失败分支

现象 下一步
503或代理连接失败 查看Apache站点ErrorLog、FPM状态和套接字路径;检查Apache用户能否连接套接字。
PHP执行但版本不是预期 查看启用的conf及FilesMatch,排查多版本处理器覆盖;CLI的php -v不能代表网站版本。
提示缺少数据库驱动 安装当前FPM版本对应扩展,并重载该FPM;不要只检查CLI扩展。
PHP脚本路径不存在 核对DocumentRoot、Alias和实际文件位置,不把全部请求无条件转发到任意脚本。

如何撤回本次配置

保留原站点配置和模块清单。新环境需要撤回FPM接入时,可停用本次启用的php8.3-fpm配置,configtest通过后reload;涉及其他站点共享FPM时,不停止其依赖服务。不要在不了解共用关系时卸载PHP或数据库。应用上线后还需单独完成所需扩展、目录权限、HTTPS及功能测试。