yii 2 高级模板 linux 部署失败主因是 php 环境缺失 mbstring/openssl/pdo_mysql/curl/json 扩展、./init 权限误用 root 导致 runtime 不可写、nginx root 未指向 frontend/web 目录。

Yii 2 高级模板在 Linux 上部署失败,90% 是环境没配对、权限搞错、Nginx 路径写反——不是框架问题,是部署链路上的三个硬点卡住了。
composer create-project 卡住或报 Class 'yii\BaseYii' not found
这不是网络慢,是 PHP 环境不达标。Yii2 2.0.48+ 要求 PHP ≥ 7.4,且必须启用以下扩展:
-
mbstring(字符串处理,缺了 autoload 就崩) -
openssl(HTTPS 包下载、证书校验依赖) -
pdo_mysql(哪怕你暂时不用数据库,init 阶段也会尝试加载) -
curl和json(Composer 自身运行必需)
检查方式:php -m | grep -E "mbstring|openssl|pdo_mysql|curl|json"。少一个就补:sudo apt install php-mbstring php-openssl php-pdo-mysql php-curl php-json(Ubuntu/Debian)或 sudo yum install php-mbstring php-opcache php-pdo php-mysqlnd php-curl php-json(CentOS/RHEL)。别跳过这步直接重试 composer,否则反复失败。
./init 执行 Permission denied 或 runtime 目录不可写
高级模板的 ./init 不是脚本执行完就结束,它会递归修改 environments/ 下文件权限、复制配置、替换占位符。用 root 运行会导致后续 PHP-FPM 无法读取 runtime/ 和 web/assets/。
- 创建专用用户,比如
www-deploy:sudo useradd -m -s /bin/bash www-deploy - 把项目目录归属改过去:
sudo chown -R www-deploy:www-deploy /var/www/yii-app - 切过去再 init:
sudo -u www-deploy -i,然后进目录执行./init,选0(Development)或1(Production) - 检查
runtime/是否可写:ls -ld runtime/应显示drwxrwxr-x且属主是你刚建的用户
Nginx 访问 500 或直接下载 index.php
根本原因是 Nginx 的 root 指向了项目根目录,而不是 frontend/web。Yii2 高级模板的 Web 入口只在 frontend/web/ 下,index.php 也在那里。
-
root必须设为:root /var/www/yii-app/frontend/web; -
index必须显式声明:index index.php; - 必须加路由转发:
try_files $uri $uri/ /index.php?$args; - PHP 处理块里,
fastcgi_pass要核对真实 socket 路径:fastcgi_pass unix:/run/php/php8.1-fpm.sock;(Ubuntu)或fastcgi_pass 127.0.0.1:9000;(CentOS),错一个字符就会报connect() failed (111: Connection refused)
改完记得 sudo nginx -t && sudo systemctl reload nginx。
日志里全是 require(): Failed opening required 'vendor/autoload.php'
这个错误说明 vendor/ 目录压根没生成,或者路径被硬编码错了。常见于两种情况:
- 你用
git clone或手动上传压缩包,但没跑composer install --no-dev(生产环境)或composer install(开发环境) - 你在项目根目录外执行了
php index.php,导致__DIR__定位偏移,require __DIR__.'/../vendor/autoload.php'找不到
验证方法:进 /var/www/yii-app/ 目录,执行 ls -l vendor/autoload.php。没有?立刻用部署用户跑 composer install --no-dev。有?那就看 Nginx error log 里完整的 require 路径,确认是不是 index.php 所在位置和 vendor/ 的相对关系被破坏了——这种情况多见于把 frontend/web 单独 symlink 出去却忘了同步 vendor。
最常被忽略的一点:所有操作必须用同一用户贯穿始终——PHP-FPM 进程用户、Nginx worker 用户、部署用户三者 UID/GID 对不上,runtime/ 和 web/assets/ 就永远是权限地狱。别图省事切 root 做一半再切回来。











