Nginx 1.20 运行 ThinkPHP 8.1 的关键是 fastcgi_pass 路径必须与 PHP-FPM 实际监听 socket 严格一致,且伪静态采用 try_files + $query_string 模式,禁用 PATH_INFO 相关配置,确保 SCRIPT_FILENAME 使用 $realpath_root、root 指向 public 目录,并校验 cgi.fix_pathinfo=1 和权限。

Nginx 1.20 下运行 ThinkPHP 8.1,关键不是“版本号是否完全匹配”,而是 fastcgi_pass 路径必须与 PHP-FPM 实际监听的 socket 文件路径严格一致,且伪静态规则要适配 TP8.1 的默认路由模式(querystring 模式,非 PATH_INFO)。
✅ 确认 PHP-FPM 的 sock 路径
PHP 8.1-fpm 默认监听的 Unix socket 路径通常为:
-
/run/php/php8.1-fpm.sock(Debian/Ubuntu 系统主流路径) -
/var/run/php/php8.1-fpm.sock(部分 CentOS/RHEL 或自编译环境) - 少数 Docker 或定制环境可能用 TCP:
127.0.0.1:9000
? 验证方法(SSH 登录后执行):
sudo systemctl status php8.1-fpm # 查看输出中 "listen =" 行,例如: # listen = /run/php/php8.1-fpm.sock
或直接检查配置文件:
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
sudo grep "^listen =" /etc/php/8.1/fpm/pool.d/www.conf
⚠️ 注意:路径末尾不能多空格、不能写错大小写,Nginx 不会报错但请求会卡在 502。
✅ Nginx location 中 fastcgi_pass 必须与之对应
在 location ~ \.php$ 或更精确的 PHP 处理块中,写法应为:
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # ← 与上一步查到的路径完全一致
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param QUERY_STRING $query_string;
include fastcgi_params;
}- 若你用的是 TCP 方式,则写
fastcgi_pass 127.0.0.1:9000; -
fastcgi_param SCRIPT_FILENAME推荐用$realpath_root(非$document_root),避免符号链接导致路径解析错误。
✅ ThinkPHP 8.1 伪静态推荐写法(绕过 PATH_INFO 依赖)
TP8.1 默认启用 url_common_param => 's',并优先走 querystring 模式(即 /index.php?s=home/index),不依赖 PATH_INFO。因此最稳的伪静态是:
location / {
try_files $uri $uri/ /index.php?$query_string;
}- ✅ 不需要
fastcgi_split_path_info - ✅ 不需要
if (!-e $request_filename)(Nginx 反模式,易出错) - ✅ 静态资源(CSS/JS/IMG)直出,PHP 请求统一交由
index.php处理
? 若项目部署在子目录(如
/myapp/),则改为:location /myapp/ { alias /var/www/html/myapp/public/; try_files $uri $uri/ /myapp/index.php?$query_string; } location ~ ^/myapp/(.+\.php)$ { alias /var/www/html/myapp/public/$1; fastcgi_pass unix:/run/php/php8.1-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param SCRIPT_NAME /index.php; fastcgi_param QUERY_STRING $query_string; }
✅ 额外校验点(常被忽略)
-
php.ini中确保cgi.fix_pathinfo=1(TP8.1 启动检测必需) -
fastcgi_params文件里不能注释或缺失fastcgi_param PATH_INFO $fastcgi_path_info;(即使不用,也建议保留) - ThinkPHP 配置中关闭
url_html_suffix,设pathinfo_depr为'/'(子目录部署时尤其重要) - Nginx 用户(如
www-data或nginx)需对public/目录有读+执行权限(x权限用于进入目录)
不复杂但容易忽略


















