基于条件的 PHP-FPM 路由 (多 PHP 版本)
在 Nginx 中实现 条件式 PHP-FPM 路由,核心思路是:
根据条件(如域名、变量、路径等)动态选择不同的 PHP-FPM 后端端口。
推荐方案:使用 map 实现条件分发(最规范)
第一步:在 http 块中定义 map
http {
map $project $php_backend {
default 127.0.0.1:9073; # 默认 PHP 7
test1 127.0.0.1:9056; # test1 使用 PHP 5
test2 127.0.0.1:9073; # test2 使用 PHP 7
}
server {
listen 80;
server_name ~^(?<project>.+)\.local$;
root /Users/suxinning/Projects/$project/public;
location / {
index index.php;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass $php_backend; # 动态选择 PHP-FPM
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
原理说明
server_name使用正则捕获子域名:~^(?<project>.+)\.local$
会生成变量
$projectmap根据$project映射到不同端口fastcgi_pass $php_backend;使用变量实现动态后端选择
不推荐的方式
不要这样写:
if ($project = test1) {
fastcgi_pass 127.0.0.1:9056;
}
原因:
if在 location 中不安全fastcgi_pass不能在if里随意使用容易导致配置异常
进阶:如果项目很多怎么办?
如果你有很多项目,可以:
方式一:统一规则
map $project $php_backend {
default 127.0.0.1:9073;
~^legacy_ 127.0.0.1:9056; # 旧项目走 PHP5
}
方式二:按目录区分
也可以根据 URI:
map $uri $php_backend {
~^/legacy 127.0.0.1:9056;
default 127.0.0.1:9073;
}
最终效果
| 域名 | PHP版本 |
|---|---|
| test1.local | PHP 5 |
| test2.local | PHP 7 |
| 其他 | PHP 7 |