Nginx + PHP-FPM 是目前运行 PHP 网站最主流的组合之一,无论是 WordPress、ThinkPHP 还是 Laravel 项目,绝大多数生产环境都采用这套架构。相比传统的 Apache mod_php 方式,Nginx 处理静态资源的能力更强,内存占用更低,而 PHP-FPM 则专门负责 PHP 脚本的解析执行,两者各司其职,配合默契。本文将完整演示从零开始搭建这套环境的全过程,包括软件安装、配置调整、Nginx 与 PHP-FPM 的对接以及最终的运行验证。

一、理解 Nginx 与 PHP-FPM 的协作原理
在动手安装之前,有必要先弄清楚这套架构的工作机制。Nginx 本身并不能执行 PHP 代码,它是一个高性能的 HTTP 服务器和反向代理。当客户端请求一个 PHP 页面时,Nginx 会把请求通过 FastCGI 协议转发给 PHP-FPM 进程,PHP-FPM 完成脚本执行后,把生成的 HTML 内容返回给 Nginx,再由 Nginx 响应给客户端。
PHP-FPM 全称是 FastCGI Process Manager,即 FastCGI 进程管理器。它维护着一组 worker 进程池,默认配置下会监听本机的 9000 端口或者一个 Unix Socket 文件。Nginx 通过 fastcgi_pass 指令指定转发目标,把请求交给这个进程池处理。理解了这条链路,后面排查 502 错误时就会知道该去检查 PHP-FPM 是否存活、端口是否在监听。
两种监听方式的区别也值得了解:TCP 方式监听 127.0.0.1:9000,配置简单,跨机器部署时必须使用;Unix Socket 方式如 /run/php-fpm/www.sock,通信开销更小,性能略高,但要求 Nginx 与 PHP-FPM 在同一台机器上。单机部署推荐 Socket 方式。
二、安装 Nginx 与 PHP-FPM
以 CentOS 为例,先安装 EPEL 扩展源,再用 yum 安装 Nginx 和 PHP 组件。PHP-FPM 包含在 PHP 的安装包中,同时建议把常用扩展一并装上:
yum install -y epel-release yum install -y nginx php php-fpm php-mysqlnd php-mbstring php-xml php-gd systemctl enable --now nginx systemctl enable --now php-fpm
如果使用 Ubuntu 或 Debian 系统,则使用 apt 完成安装,命令稍有不同:
apt update apt install -y nginx php-fpm php-mysql php-mbstring php-xml php-gd systemctl enable --now nginx php8.1-fpm
注意 Ubuntu 下的服务名通常带有版本号,例如 php8.1-fpm,可以通过 systemctl list-units | grep fpm 查看实际名称。安装完成后,在浏览器访问服务器 IP,看到 Nginx 的欢迎页说明 Web 服务器已经正常工作。用 php -v 命令可以确认 PHP 版本,用 systemctl status php-fpm 确认进程管理器处于 running 状态。
三、修改配置文件并完成对接
PHP-FPM 的主配置文件在 CentOS 上位于 /etc/php-fpm/www.conf,Ubuntu 上则分布在 /etc/php/8.1/fpm/pool.d/www.conf。重点关注监听设置,找到 listen 这一行:
; 监听 Unix Socket(推荐单机使用) listen = /run/php-fpm/www.sock ; 或者监听 TCP 端口 ; listen = 127.0.0.1:9000 ; 设置运行用户,需与 Nginx 的 worker 进程一致 user = nginx group = nginx listen.owner = nginx listen.group = nginx
把 listen.owner 和 listen.group 设置为与 Nginx 相同的用户(CentOS 上是 nginx,Ubuntu 上是 www-data),可以避免 Socket 权限导致的 502 错误。接下来配置 Nginx 虚拟主机,编辑 /etc/nginx/conf.d/test.conf:
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}其中 location ~ \.php$ 用正则匹配所有以 .php 结尾的请求,fastcgi_param SCRIPT_FILENAME 告诉 PHP-FPM 去哪里找脚本文件,这一行如果写错,访问时会直接返回 File not found。try_files $uri =404 则能防止路径遍历类安全问题,建议始终保留。
修改完成后执行 nginx -t 检查语法,再执行 systemctl reload nginx 和 systemctl restart php-fpm 让配置生效。
四、测试运行与常见问题排查
在网站根目录创建测试文件 info.php,内容如下:
<?php phpinfo(); ?>
浏览器访问 http://服务器IP/info.php,如果能看到 PHP 的信息页面,说明整条链路已经打通。测试完成后务必删除该文件,因为它会暴露服务器的详细配置信息,存在安全隐患。
搭建过程中最常见的两类问题:一是 502 Bad Gateway,通常是 PHP-FPM 没有启动或 Socket 路径写错,先执行 systemctl status php-fpm 检查进程,再用 ss -tlnp | grep 9000 或 ls -l /run/php-fpm/ 确认监听状态;二是 File not found,多数是 SCRIPT_FILENAME 参数配置错误,或者 root 目录指定得不对,对照上文配置逐项检查即可。另外,SELinux 开启时也可能拦截 Nginx 对 Socket 的访问,临时可用 setenforce 0 验证,长期方案是执行 chcon -t httpd_sys_rw_content_t 调整安全上下文。
环境跑通之后,还可以进一步优化:调整 PHP-FPM 的 pm.max_children 进程数上限、开启 OPcache 加速脚本执行、配置 open_basedir 限制 PHP 的文件访问范围等。这些调优手段能让你的 Nginx + PHP-FPM 环境在高并发场景下依然保持稳定高效。