如何在腾讯云CVM上配置ThinkPHP云主机并部署?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1095个文字,预计阅读时间需要5分钟。
直接上结论:
为什么不能用腾讯云市场的 LNMP 镜像
市场镜像大多基于老旧 CentOS 7 + PHP 7.2 静态编译,模块硬编码、升级路径断裂。比如你项目依赖 yaml 扩展,Ubuntu 22.04 的 apt 源默认不带,而市场镜像连 pecl 都没装全;又或者你用了 mysql_connect(),PHP 8+ 已彻底移除该函数,但镜像里 PHP 版本锁死,没法切到 7.4 兼容。
更实际的问题是:open_basedir 路径写死、php-fpm.sock 权限混乱、SSL 自动续签配置缺失——这些在 lnmp install 脚本里都已预置处理,手改配置容易漏项。
- 用
lnmp.org:执行./lnmp install,自动关 SELinux、调 ulimit、生成防跨站配置 - Ubuntu 20.04+ 用户注意先
sudo systemctl disable systemd-resolved,否则apt update可能超时中断 - 装完用
lnmp php-version切 PHP 8.2(新项目)或 7.4(老项目),别硬改/usr/local/php/bin/php软链
ThinkPHP 的 public/ 目录必须暴露为 Web 根目录
很多人把整个 ThinkPHP 项目(含 application/、think、runtime/)直接扔进 /var/www/html,结果访问域名只看到 404 或直接列出文件——因为 public/index.php 才是唯一合法入口,其他目录绝不能被 Web 服务器直接访问。
立即学习“PHP免费学习笔记(深入)”;
Nginx 配置里必须明确指定 root /data/wwwroot/your-project/public;,而不是项目根目录。否则 .htaccess(Apache)或重写规则(Nginx)根本不会生效,index.php/s=/admin 这类路由全崩。
- 确认
location /块内写了标准重写:if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } - 别套用 Laravel 或 WordPress 的伪静态规则,ThinkPHP 5.1+ 依赖
s=参数解析 PATH_INFO - 宝塔用户请手动清空伪静态框,粘贴上述规则,不要点“启用 ThinkPHP”按钮——它有时会加错
try_files
runtime/ 和 vendor/ 目录部署常见坑
Class 'think\App' not found 不是框架缺文件,是自动加载器挂了。核心就两点:一是 vendor/autoload.php 没传上去,二是 runtime/ 不可写或路径写死了本地绝对路径。
上传前必须执行 composer install --no-dev,而不是直接复制本地 vendor/;Git 部署要检查 vendor/ 是否被 .gitignore 排除。另外,index.php 里引入 autoload 的路径如果写成 /Users/xxx/project/vendor/autoload.php,上线必报错。
-
runtime/目录必须存在,且权限为755(Linux 下chmod -R 755 runtime) - 但不要上传本地已生成的
runtime/cache/、runtime/log/,清空再传,避免缓存污染 - 确认
opcache.enable_cli = 1(php -i | grep opcache查),否则php think optimize:route生成的缓存无法加载
HTTPS 下上传大文件失败怎么调
开 HTTPS 后,413 Request Entity Too Large 很常见,不是腾讯云限制,是你自己没对齐 Nginx 和 PHP 的三处上限:
Nginx 的 client_max_body_size、PHP 的 upload_max_filesize 和 post_max_size 必须一致,且 post_max_size ≥ upload_max_filesize。漏调任何一项都会导致静默失败或 413。
- Nginx 配置(server 块内):
client_max_body_size 100m; - PHP 配置(
php.ini):upload_max_filesize = 100M、post_max_size = 100M、max_execution_time = 300 - 改完必须执行
lnmp php reload(不是 restart),reload 不中断已有请求
复杂点在于:有些项目还用了 nginx-unit 或 oneinstack,它们的 PHP 配置路径和重载命令不同,得先 find / -name php.ini 2>/dev/null 定位真实配置文件,再确认 reload 方式。别假设所有环境都走 lnmp 流程。
本文共计1095个文字,预计阅读时间需要5分钟。
直接上结论:
为什么不能用腾讯云市场的 LNMP 镜像
市场镜像大多基于老旧 CentOS 7 + PHP 7.2 静态编译,模块硬编码、升级路径断裂。比如你项目依赖 yaml 扩展,Ubuntu 22.04 的 apt 源默认不带,而市场镜像连 pecl 都没装全;又或者你用了 mysql_connect(),PHP 8+ 已彻底移除该函数,但镜像里 PHP 版本锁死,没法切到 7.4 兼容。
更实际的问题是:open_basedir 路径写死、php-fpm.sock 权限混乱、SSL 自动续签配置缺失——这些在 lnmp install 脚本里都已预置处理,手改配置容易漏项。
- 用
lnmp.org:执行./lnmp install,自动关 SELinux、调 ulimit、生成防跨站配置 - Ubuntu 20.04+ 用户注意先
sudo systemctl disable systemd-resolved,否则apt update可能超时中断 - 装完用
lnmp php-version切 PHP 8.2(新项目)或 7.4(老项目),别硬改/usr/local/php/bin/php软链
ThinkPHP 的 public/ 目录必须暴露为 Web 根目录
很多人把整个 ThinkPHP 项目(含 application/、think、runtime/)直接扔进 /var/www/html,结果访问域名只看到 404 或直接列出文件——因为 public/index.php 才是唯一合法入口,其他目录绝不能被 Web 服务器直接访问。
立即学习“PHP免费学习笔记(深入)”;
Nginx 配置里必须明确指定 root /data/wwwroot/your-project/public;,而不是项目根目录。否则 .htaccess(Apache)或重写规则(Nginx)根本不会生效,index.php/s=/admin 这类路由全崩。
- 确认
location /块内写了标准重写:if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } - 别套用 Laravel 或 WordPress 的伪静态规则,ThinkPHP 5.1+ 依赖
s=参数解析 PATH_INFO - 宝塔用户请手动清空伪静态框,粘贴上述规则,不要点“启用 ThinkPHP”按钮——它有时会加错
try_files
runtime/ 和 vendor/ 目录部署常见坑
Class 'think\App' not found 不是框架缺文件,是自动加载器挂了。核心就两点:一是 vendor/autoload.php 没传上去,二是 runtime/ 不可写或路径写死了本地绝对路径。
上传前必须执行 composer install --no-dev,而不是直接复制本地 vendor/;Git 部署要检查 vendor/ 是否被 .gitignore 排除。另外,index.php 里引入 autoload 的路径如果写成 /Users/xxx/project/vendor/autoload.php,上线必报错。
-
runtime/目录必须存在,且权限为755(Linux 下chmod -R 755 runtime) - 但不要上传本地已生成的
runtime/cache/、runtime/log/,清空再传,避免缓存污染 - 确认
opcache.enable_cli = 1(php -i | grep opcache查),否则php think optimize:route生成的缓存无法加载
HTTPS 下上传大文件失败怎么调
开 HTTPS 后,413 Request Entity Too Large 很常见,不是腾讯云限制,是你自己没对齐 Nginx 和 PHP 的三处上限:
Nginx 的 client_max_body_size、PHP 的 upload_max_filesize 和 post_max_size 必须一致,且 post_max_size ≥ upload_max_filesize。漏调任何一项都会导致静默失败或 413。
- Nginx 配置(server 块内):
client_max_body_size 100m; - PHP 配置(
php.ini):upload_max_filesize = 100M、post_max_size = 100M、max_execution_time = 300 - 改完必须执行
lnmp php reload(不是 restart),reload 不中断已有请求
复杂点在于:有些项目还用了 nginx-unit 或 oneinstack,它们的 PHP 配置路径和重载命令不同,得先 find / -name php.ini 2>/dev/null 定位真实配置文件,再确认 reload 方式。别假设所有环境都走 lnmp 流程。

