不能靠多个 location ~ .php$ 块实现不同站点走不同 php-fpm 实例,因为 location 仅匹配 uri 路径而不识别域名,多站点需以根路径 / 运行,所有 php 请求均为 /.php,无法进入带路径前缀的 location;必须为每个站点配置独立 server 块,并在其中设置专属 fastcgi_pass 和对应的 php-fpm 池。

不能靠多个 location ~ \.php$ 块来实现不同站点走不同 PHP-FPM 实例——Nginx 的 location 匹配是基于 URI 路径的,不是基于域名或站点根目录;真正隔离 PHP 运行环境,必须靠 server 块 + 独立 fastcgi_pass 配置,而非在同一个 server 内拆 location。
为什么不能用多个 location 块转发不同 FPM
Nginx 的 location 是路径匹配机制,它不感知“这是哪个站点”,只看请求 URL 中的路径部分(如 /api/v1/ 或 /wp-admin/)。即使你写:
location ^~ /site1/ {
fastcgi_pass unix:/run/php/php8.1-fpm-site1.sock;
}
location ^~ /site2/ {
fastcgi_pass unix:/run/php/php8.1-fpm-site2.sock;
}
这只会匹配类似 https://example.com/site1/index.php 这种带前缀的路径,而真实多站点场景下,每个站点都希望以根路径(/)运行,比如 site1.com/ 和 site2.com/。此时所有 PHP 请求都是 /.php,根本进不了你预设的带路径前缀的 location 块。
常见错误现象:
- PHP 文件返回 502 Bad Gateway,
nginx -t却显示语法正常 - 日志里反复出现
connect() to unix:/run/php/xxx.sock failed (2: No such file or directory) - 两个站点共用一个 PHP-FPM 池,改一个的
php_admin_value,另一个也跟着变
正确做法:每个站点一个 server 块 + 独立 fastcgi_pass
多站点 PHP 隔离的本质,是让每个 server 块独立声明自己该用哪个 PHP-FPM socket 或端口。这才是 Nginx 虚拟主机模型的设计原意。
实操要点:
- 为每个站点新建独立配置文件,例如
/etc/nginx/sites-available/site1.com和/etc/nginx/sites-available/site2.com - 每个
server块内,root指向各自网站根目录,server_name明确绑定域名 -
location ~ \.php$必须出现在对应server块内,并且fastcgi_pass指向该站点专属的 PHP-FPM socket(如unix:/run/php/php8.1-fpm-site1.sock) - 确保 PHP-FPM 已创建对应池配置(
/etc/php/8.1/fpm/pool.d/site1.conf),且服务已重载:systemctl reload php8.1-fpm
示例片段(site1.com):
server {
listen 80;
server_name site1.com;
root /var/www/site1;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.1-fpm-site1.sock;
}
}
PHP-FPM 池配置必须与 Nginx 对齐
Nginx 只负责转发,PHP-FPM 才真正执行代码。如果两者 socket 路径、用户权限、工作目录不一致,就会 502 或 403。
关键检查项:
-
listen = /run/php/php8.1-fpm-site1.sock—— 必须和 Nginx 中fastcgi_pass完全一致(包括路径、权限、所属用户) -
user = site1user和group = site1group—— 该用户需对/var/www/site1有读+执行权限 -
chdir = /或chdir = /var/www/site1—— 影响chdir()等函数行为,建议显式设为站点根目录 -
php_admin_value[open_basedir]—— 强烈建议设置,限制脚本只能访问本目录及子目录,避免跨站读取
漏掉 chdir 或 open_basedir 是线上最常被忽略的安全盲点,尤其当多个站点共用同一台服务器时。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











