thinkphp部署到linux核心是三件事:public必须设为web根目录、runtime目录需赋予web用户读写权限、nginx须用try_files正确转发请求至index.php;同时php版本需≥7.4(tp6.1+)或≥8.0.0(tp8),并启用mbstring、openssl、pdo等扩展。

确认PHP环境和必需扩展
ThinkPHP 6.1+要求PHP ≥ 7.4,TP8强制要求PHP ≥ 8.0.0。但光看php -v不够,还得验证PHP-FPM用的是否是同一版本:
- 终端执行
php -v,确认版本达标 - 运行
ps aux | grep php-fpm,找到PHP-FPM进程路径(如/usr/bin/php-fpm82),再用该路径查版本:/usr/bin/php-fpm82 -v - 检查关键扩展是否启用:
php -m | grep -E "mbstring|openssl|pdo|pdo_mysql|curl|fileinfo",缺一个都可能让路由加载失败或数据库连不上 - Ubuntu用户注意:
/etc/php/8.2/fpm/php.ini和/etc/php/8.2/cli/php.ini是两份配置,Nginx走FPM,所以重点改fpm目录下的ini
Nginx配置必须指向public并正确转发
错误做法是把整个项目根目录(含app、config)设为root——这会让敏感文件被直接访问。正确做法是只暴露public/,并让所有动态请求落到index.php:
-
root必须设为/var/www/myapp/public,不是/var/www/myapp - 用
try_files $uri $uri/ /index.php?$query_string;,别用if (!-e $request_filename),Nginx官方明确说它在location里行为不可靠 -
fastcgi_param SCRIPT_FILENAME建议用$realpath_root$fastcgi_script_name,避免软链接环境下报“No input file specified” - 删掉配置里所有
fastcgi_split_path_info相关行——TP不依赖它,留着会导致PATH_INFO错乱
修复runtime权限与用户组对齐
runtime目录写不进,日志没记录、缓存生成失败、首页空白但无报错——这是最常被忽略的环节:
- 先查Nginx工作用户:
ps aux | grep nginx | head -1(Ubuntu多为www-data,CentOS多为nginx) - 再查PHP-FPM配置里的
user和group(路径如/etc/php/8.2/fpm/pool.d/www.conf),确保和Nginx用户一致或同组 - 执行:
chgrp www-data runtime && chmod 775 runtime && chmod g+s runtime——g+s确保新生成的子目录自动继承组 - 别用777:runtime/cache和runtime/session里存的是敏感数据,开放过宽等于留后门
上传前的本地准备和环境收尾
很多问题其实发生在上传之前,而不是服务器配置之后:
- 上传前删掉本地
runtime/整个文件夹(保留空目录结构即可),避免缓存干扰首次运行 -
.env文件默认被Git忽略,极易遗漏;它必须放在项目根目录(和composer.json同级),不能叫.env.local或其他名字 - 生产环境务必关闭调试:
APP_DEBUG=false,并在config/app.php里确认'app_debug' => false - 数据库配置不要硬编码在代码里,统一走
.env,上线后再在宝塔或手动填入真实账号密码
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











