核心是Nginx正确路由请求并将.php文件交PHP-FPM执行:需确保PHP-FPM运行且Unix socket路径与权限匹配,配置独立虚拟主机,设置root指向public目录、location ~ .php$规则及SCRIPT_FILENAME参数,最后绑定域名、设权限并用phpinfo()验证。

直接配置 Nginx 虚拟主机跑 PHP 站点,核心是两件事:让 Nginx 正确路由请求,再把 .php 文件交给 PHP-FPM 执行。不需要 Apache 那套模块加载逻辑,结构更清晰,也更轻量。
1. 确保 PHP-FPM 已就绪且监听 Unix Socket
PHP-FPM 是执行 PHP 的“引擎”,Nginx 只负责转发,不解析代码。必须先确认它在运行,并用 Unix Socket(推荐)而非 TCP 端口通信:
- 检查服务状态:
sudo systemctl status php*-fpm(如php8.2-fpm) - 打开配置文件:
sudo nano /etc/php/*/fpm/pool.d/www.conf - 确认以下三项匹配(尤其用户组):
listen = /run/php/php8.2-fpm.socklisten.owner = www-datalisten.group = www-data - 重启生效:
sudo systemctl restart php8.2-fpm
2. 创建独立的虚拟主机配置文件
不要改默认配置,为每个站点单独建配置,便于管理。例如为 myapp.test 建站:
- 新建配置:
sudo nano /etc/nginx/sites-available/myapp.test - 内容示例(关键点已加注):
server {
listen 80;
server_name myapp.test;
root /var/www/myapp/public; # 指向框架 public 目录(非项目根)
index index.php;
<pre class='brush:php;toolbar:false;'>location / {
try_files $uri $uri/ /index.php?$query_string; # 支持 Laravel/Symfony 路由
}
location ~ \.php$ {
include snippets/fastcgi-php.conf; # 标准 FastCGI 参数
fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 必须与 php-fpm.sock 路径一致
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 关键!传真实路径
}
location ~ /\.ht {
deny all; # 禁止访问 Apache 配置文件(安全)
}}
立即学习“PHP免费学习笔记(深入)”;
- 启用站点:
sudo ln -sf /etc/nginx/sites-available/myapp.test /etc/nginx/sites-enabled/
3. 绑定域名 + 权限 + 测试
三步收尾,缺一不可:
-
本地测试域名:编辑
/etc/hosts,加一行:127.0.0.1 myapp.test -
目录权限:确保 Nginx 用户(通常是
www-data)能读取代码:sudo chown -R www-data:www-data /var/www/myapp -
验证配置 & 重载:
sudo nginx -t && sudo systemctl reload nginx -
写个测试页:在
/var/www/myapp/public/info.php放入<?php phpinfo(); ?>,浏览器访问http://myapp.test/info.php
4. 常见卡点提醒
90% 的问题集中在这几个细节:
-
SCRIPT_FILENAME参数漏写或路径错——导致 502 或空白页 - PHP-FPM socket 文件路径与
fastcgi_pass不一致(注意版本号、路径是/run/php/还是/var/run/php/) - 框架项目没指向
public/目录(如 Laravel、ThinkPHP),而是直接 root 到项目根,会暴露敏感文件 - SELinux 或 AppArmor 开启时拦截 socket 访问(CentOS/RHEL 系统需额外放行)



















