Nginx连接PHP-FPM运行PHP网站
Nginx本身不会执行PHP,需要将PHP请求交给PHP-FPM。本文针对Ubuntu 24.04官方软件仓库的PHP 8.3与Nginx,假设静态站点已经通过测试。宝塔、容器或其他发行版的目录、服务名和套接字可能不同,应沿用各自管理方式;住宅云不适用于建站。
本教程以静态站点已能正常返回为前提;从零开始时先完成Nginx静态站点部署,已有正式环境只核对对应条件,不重复安装或覆盖旧配置。
确认PHP-FPM已运行并找到真实套接字
sudo apt update
sudo apt install php8.3-fpm php8.3-mysql
systemctl is-active php8.3-fpm
ls -l /run/php/
sudo grep -E "^[[:space:]]*listen[[:space:]]*=" /etc/php/8.3/fpm/pool.d/www.conf
Ubuntu默认池通常监听/run/php/php8.3-fpm.sock,以刚读取的listen值为准。路径不存在时先检查服务与池配置,不凭PHP命令行版本猜测套接字。不要为了让Nginx能连接而把FPM公网监听在0.0.0.0:9000,也不要把套接字权限改为777。
在目标站点内加入PHP处理
编辑目标server块,保持已有root和server_name,修改默认首页并增加以下location。若系统已有相同PHP location,应核对并调整原块,不重复叠加两套。
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ /\. {
deny all;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
snippets/fastcgi-php.conf是Ubuntu发行版提供的配置,包含脚本检查与参数;不要把本段原样搬到不存在该文件的系统。其中的点文件匹配规则限制隐藏文件及目录访问;之后配置ACME webroot验证时,需要为验证路径单独设计规则,不能假设点目录都能访问。
sudo nginx -t
sudo systemctl reload nginx
只在检测成功后加载。若返回找不到include文件,应确认Nginx安装来源,按对应发行版配置,不删除检查来“消除报错”。
用最小PHP文件验证后立即清理
在新测试文件中只输出固定文字和版本,不公开完整phpinfo。假设目标根目录为/var/www/baole-demo:
printf '%s\n' '<?php header("Content-Type: text/plain; charset=utf-8"); echo "PHP OK\n", PHP_VERSION, "\n";' | sudo tee /var/www/baole-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系列版本,而不是<?php源代码。验证后删除自己创建的baole-php-check.php。若源代码被下载或直接显示,立即停止对外提供该PHP站点,核查处理规则后再部署含凭据的真实程序。
按结果定位问题
| 结果 | 先检查 |
|---|---|
| 502 Bad Gateway | FPM是否active、套接字路径和Nginx进程连接权限;查看对应站点error_log。 |
| 404或File not found | 站点root、实际脚本路径和文件存在性,不先更换服务器。 |
| 静态页正常、PHP源代码被返回 | PHP location是否命中、是否加载了正确站点;先控制暴露。 |
| PHP执行但数据库扩展缺失 | 确认FPM版本对应的mysql扩展,不只查看CLI的php -m。 |
回退时恢复本次修改前的站点配置,检测后reload;保留FPM服务和数据供核查,不通过卸载整套环境处理单个路径错误。