PHP-FPM 是 Linux 上部署 PHP 的常见方式,但真正容易出错的环节,往往不是安装命令本身,而是监听地址、运行用户和 Web 服务器转发配置没有统一。下面按实际部署顺序梳理一遍,从安装、进程池参数到 Nginx 或 Apache 对接,再到最后验证,方便你快速搭起可用环境,也能在访问失败时知道该优先检查哪里。
安装 PHP-FPM
先确认系统里已经准备好 PHP 运行环境,再安装 PHP-FPM 服务。不同发行版使用的包管理器不同,命令也略有区别。
Debian/Ubuntu 安装方式
sudo apt-get update
sudo apt-get install php-fpm
如果你使用的是 Debian 系发行版,例如 Ubuntu,直接执行上面两条命令即可完成安装。
CentOS/Red Hat 安装方式
sudo yum install epel-release
sudo yum install php-fpm
在 Red Hat 系环境中,通常先安装 EPEL 源,再安装 php-fpm。
安装完成后,可以用下面的命令确认 PHP 版本是否正常:
php -v
这一步的意义不只是看版本号,也是在确认 PHP 本体已经可用,后续配置才有基础。
修改 PHP-FPM 配置文件
PHP-FPM 的配置目录通常位于 /etc/php/{version}/fpm/,其中 {version} 需要替换成实际 PHP 版本。主配置文件是 php-fpm.conf,但日常部署时最常调整的通常是进程池配置文件 pool.d/www.conf。

打开这个文件:
/etc/php/{version}/fpm/pool.d/www.conf
常见配置大致如下:
; 监听地址和端口
listen = 127.0.0.1:9000
; 用户和组
user = www-data
group = www-data
; 进程管理
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
先看 listen:决定 Web 服务器往哪里转发
listen 用来指定 PHP-FPM 接收请求的方式。示例里使用的是 127.0.0.1:9000,也就是本地 TCP 端口。另一种常见写法是 Unix 套接字,例如:
/var/run/php/php7.4-fpm.sock
如果你的 Web 服务器和 PHP-FPM 在同一台机器上,Unix 套接字通常更常见,开销也更低。无论你选哪种方式,后面的 Nginx 或 Apache 配置都必须与这里保持一致。
再看 user 和 group:避免权限问题
user 和 group 需要与 Web 服务器运行账户匹配。比如在 Debian/Ubuntu 上,Nginx 或 Apache 常见账户是 www-data。如果这里设置不一致,最常见的结果就是 PHP 文件能被转发,但脚本访问目录、缓存或上传路径时发生权限错误。
进程池参数怎么理解
pm = dynamic 是多数场景下比较稳妥的选择,它会根据负载动态调整子进程数量。下面几个参数分别控制并发上限与空闲进程数量:
pm.max_children:允许存在的最大子进程数pm.start_servers:服务启动时创建的子进程数pm.min_spare_servers:最少保留的空闲进程数pm.max_spare_servers:最多保留的空闲进程数
如果服务器资源有限,这些值不宜设得过高;如果访问量较大,又要避免设置过低导致请求排队。原文里的参数是一组可直接起步的基础值,后续可以再按实际负载调整。
启动服务并设置开机自启
配置完成后,需要先把 PHP-FPM 服务启动起来,并加入开机自启。
sudo systemctl start php{version}-fpm
sudo systemctl enable php{version}-fpm
这里的 {version} 同样替换为你的实际 PHP 版本,例如 php7.4-fpm。执行后,当前会话中服务会立即运行,服务器重启后也会自动拉起。
让 Nginx 或 Apache 把 PHP 请求转给 PHP-FPM
PHP-FPM 启动后还不够,Web 服务器必须知道遇到 .php 文件时该交给谁处理。这一步本质上是在建立“请求转发关系”。

Nginx 配置示例
在 Nginx 的 server 块中加入处理 PHP 的 location:
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php{version}-fpm.sock; # 用Unix套接字
# fastcgi_pass 127.0.0.1:9000; # 或TCP/IP
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
这里最关键的是 fastcgi_pass。如果 PHP-FPM 的 listen 配置成 Unix 套接字,这里就必须写对应的套接字路径;如果是 127.0.0.1:9000 这种 TCP 方式,这里就要改成同样的地址和端口。两边只要不一致,请求就无法正确转发。
Apache 配置示例
如果使用 Apache,需要先启用 proxy_fcgi 和 setenvif 模块,然后在 VirtualHost 中加入:
SetHandler "proxy:fcgi://localhost:9000"
这里的 localhost:9000 也要与 PHP-FPM 的监听配置一致。如果你不是监听 9000 端口,而是改成了其他地址或 Unix 套接字,就需要同步修改 Apache 的转发方式。
重启服务并验证是否生效
Web 服务器配置改完后,需要重启对应服务,让新配置正式生效。

重启 Nginx 或 Apache
Nginx:
sudo systemctl restart nginx
Apache:
sudo systemctl restart apache2
创建测试文件检查链路是否打通
在站点文档根目录下新建一个 info.php 文件,内容如下:
然后在浏览器访问:
http://你的服务器地址/info.php
如果页面能够正常显示 PHP 信息,说明 Web 服务器已经成功把请求交给 PHP-FPM 处理,整条链路是通的。
访问失败时优先检查什么
如果没有看到 PHP 信息页,通常优先排查这几项:
- PHP-FPM 是否已经成功启动
listen与fastcgi_pass或SetHandler是否完全一致- 套接字路径是否写对
- Web 服务器运行用户与 PHP-FPM 的
user、group是否匹配
这类问题大多不是 PHP 本身损坏,而是服务之间的连接关系没有对上。
部署时还要注意的两件事
第一,修改配置文件前最好先备份原文件,这样一旦改错可以快速回退。第二,不同 Linux 发行版、不同 PHP 版本在目录结构和服务名称上可能略有差异,但安装、配置进程池、让 Web 服务器转发、最后验证这条主线基本不变。
如果你按这条顺序操作,PHP-FPM 在 Linux 上的部署通常不会太复杂。真正要抓住的重点只有一个:PHP-FPM 的监听方式,必须和 Web 服务器的转发配置严格对应。







