ThinkPHP Linux部署故障90%源于环境适配:502查PHP-FPM存活与PATH_INFO传递,404查Nginx伪静态及root指向public目录,Permission denied用namei逐级验x权限,类找不到先确认url_route_on和文件名大小写。

Linux部署ThinkPHP后出问题,别急着改代码——90%的故障不是逻辑错误,而是环境适配没到位。核心就三件事:权限对不对、路径认不认、转发通不通。
先看报错类型,快速锁定方向
不同错误对应不同排查层:
- 502 Bad Gateway:Nginx发出了请求,但PHP-FPM没回话。重点查PHP-FPM是否存活、PATH_INFO是否传过去、fastcgi缓冲区是否溢出;
- 404 Not Found:Nginx压根没把请求交给index.php。说明伪静态没生效,或root路径指向错误(比如指向项目根目录而非public);
-
Permission denied:不是runtime没写权限,而是PHP进程用户进不了某一级父目录——用
namei -l /path/to/runtime逐级看哪一层缺x权限; -
类找不到 / 路由无效:先确认
url_route_on => true已开启,再检查Linux下控制器文件名大小写是否与命名空间完全一致(如User.php不能写成user.php)。
runtime目录权限必须一步到位
ThinkPHP启动时要自动创建runtime/modelruntime/log等子目录,但前提是它能“走进去”。光给runtime设755远远不够:
- 执行
ps aux | grep php-fpm确认Web进程用户(如www-data、nginx); - 用
namei -l /var/www/myapp/runtime检查从/开始每一级目录的属主和x权限; - 确保
runtime及其所有父目录(如myapp、www)对该用户都有x权限; - 运行
sudo chown -R www-data:www-data runtime,再用find runtime -type d -exec chmod 755 {} \;统一目录权限。
Nginx配置绕不开两个关键点
ThinkPHP在Linux上跑不起来,多半卡在这两处:
立即学习“PHP免费学习笔记(深入)”;
-
root必须指向public目录:例如
root /var/www/myapp/public;。若指向项目根目录,Nginx会去找/var/www/myapp/index.php,而它实际在public/下; -
PHP处理块禁用
fastcgi_split_path_info:这个指令会干扰ThinkPHP的PATH_INFO解析,直接删掉或注释; - 推荐用
try_files兜底:location / { try_files $uri $uri/ /index.php?$query_string; },简洁且兼容所有ThinkPHP版本。
扩展与环境别漏查CLI和FPM两套配置
fileinfo、intl这些扩展,在命令行里php -m能看到,不代表Web也能用:
- 执行
php --ini看CLI用的是哪个php.ini; - 执行
ps aux | grep php-fpm,再用/usr/bin/php-fpm --ini查FPM实际加载的配置; - 分别运行
php -m | grep fileinfo和php-fpm -m | grep fileinfo,两个都得有; - intl扩展依赖ICU库,Debian系装
libicu-dev,CentOS系装libicu-devel,再确认php.ini中extension=intl已启用。



















