直接上生产环境前,90%的部署问题源于环境未对齐或权限/路径配置错误:PHP版本需≥7.4(推荐8.0+),缺mbstring、pdo_mysql等扩展会导致autoload失败;./init必须用普通用户执行,Nginx root须指向frontend/web而非项目根目录;runtime/和web/assets目录需赋予www-data写权限。

直接上生产环境前,composer create-project 卡住、Class 'yii\BaseYii' not found、Nginx 返回 500 或下载 PHP 文件——这些问题 90% 不是 Yii 本身的问题,而是环境没对齐或权限/路径配置错了一处。
PHP 版本和扩展不达标,composer install 就会失败
Yii2 高级模板要求 PHP ≥ 7.4(推荐 8.0+),缺一个扩展就可能在 autoload 阶段崩掉。别只看 php -v,还要确认扩展是否真正启用:
-
php -m | grep -E "mbstring|openssl|pdo_mysql|curl|json"—— 缺哪个就装哪个,Ubuntu 上通常是sudo apt install php-mbstring php-xml php-curl php-zip php-opcache -
pdo_mysql要求已安装对应数据库驱动,MySQL 8+ 还得确认default_socket_timeout和mysql.default_socket在php.ini中没被注释或设为无效路径 - 常见报错:
require(): Failed opening required 'vendor/autoload.php',基本等于vendor/根本没生成全,根源十有八九是扩展缺失或 Composer 被中断
./init 必须用普通用户执行,root 会埋坑
init 不是复制粘贴脚本,它要递归修改 environments/ 下文件权限、替换占位符、生成 common/config/main-local.php 等。用 root 执行会导致后续 Nginx + PHP-FPM 因权限过高拒绝读取配置。
- 创建专用部署用户:
useradd -m -s /bin/bash yiiapp,再chown -R yiiapp:www-data /path/to/project - 切到该用户后执行:
su - yiiapp -c "/path/to/project/init",选1(Production) - 如果提示
Permission denied,检查environments/production/是否可写:ls -ld environments/production;上传压缩包后常因未chown导致属主还是root
Nginx root 必须指向 frontend/web,不是项目根目录
高级模板有两个入口:frontend/web 和 backend/web,但默认只暴露前端。把 root 设成项目根目录,Nginx 就会尝试把 index.php 当静态文件下载,或者因没匹配到 location ~ \.php$ 规则而 500。
- 正确配置片段(Nginx):
root /path/to/project/frontend/web; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 注意 socket 路径是否匹配你的 PHP-FPM 实际监听地址 } - Ubuntu 常见 socket 路径:
unix:/run/php/php8.1-fpm.sock;CentOS/RHEL 多用127.0.0.1:9000;错一个字符,error.log里只有connect() failed (111: Connection refused) - 改完记得
sudo nginx -t && sudo systemctl reload nginx,别漏测试配置
Linux 下表名大小写敏感,模型里 tableName() 必须完全匹配
Windows 开发时用 'User' 或 'user' 都能查出来,但 Linux 默认开启 lower_case_table_names=0,表名严格区分大小写。模型里写错一个字母,查询就静默失败。
- 先确认 MySQL 实际表名:
SHOW TABLES LIKE 'user';(注意引号和大小写) - 模型中必须严格一致:
public static function tableName() { return 'user'; // 不能写成 'User' 或 'USER' } - 如果数据库里是驼峰命名(如
userProfile),Linux 下建表语句必须显式用反引号:CREATE TABLE `userProfile` (...),否则 MySQL 会自动转成小写
最易被忽略的是 runtime/ 和 web/assets/ 目录的写权限——PHP-FPM 用户(如 www-data)必须能往里写缓存和发布资源,否则路由规则生效、页面却空白或 JS/CSS 加载 404。别只 chmod 755,得 chown -R www-data:www-data runtime web/assets。











