应将_runtime和assets目录属组设为Web服务器用户(如www-data),并赋予g+rwxs权限,同时确保父目录有r-x权限,而非简单chmod 777。

chmod 设置 _runtime 和 assets 目录可写失败?先确认 Web 服务器用户
Yii2 启动报错 Unable to write in the /path/to/runtime directory,本质是 PHP 进程没权限写入这两个目录。不是简单 chmod 777 就完事——Web 服务器(如 Nginx/Apache)以特定用户身份运行 PHP,你得让这个用户对目录有写权限。
- 查当前 Web 用户:Nginx 常用
www-data(Ubuntu/Debian)或nginx(CentOS/RHEL);Apache 多为www-data或apache - 用
ps aux | grep nginx或ps aux | grep apache看主进程启动用户 - 别直接改 PHP-FPM 的
user配置去迁就目录权限,本末倒置
正确设置权限的三步操作(非 777)
给 _runtime 和 assets 赋权,核心是「属组 + sgid + 有限权限」,兼顾安全与可用。
- 确保两个目录属组和 Web 用户一致:
sudo chgrp -R www-data /path/to/yii2/basic/runtime /path/to/yii2/basic/web/assets - 加写权限并设 sgid(保证新生成子目录继承组):
sudo chmod -R g+rwxs /path/to/yii2/basic/runtime /path/to/yii2/basic/web/assets - 确认父目录(如
web/和basic/)至少对组有r-x权限,否则 Web 进程进不去
为什么 assets 目录常被忽略?它依赖 Web 服务器写入能力
assets 是 Yii2 自动发布资源(JS/CSS)的目录,由 AssetManager 在运行时生成。如果权限不对,页面可能加载空白 JS、404 资源文件,但错误日志里不报错,只默默跳过发布。
- 常见现象:页面样式错乱、JS 不执行、
web/assets/下空空如也或只有旧哈希目录 - 它不像
_runtime那样必然报错,所以更容易漏检 - 若用
yii asset/compress手动预发布,那只是绕过运行时写入,不能替代目录权限设置
生产环境必须关掉 debug 模式再验证权限
开发模式下 Yii2 会频繁写日志、缓存、临时文件到 _runtime,掩盖真实权限问题;而生产模式(YII_DEBUG = false)下行为更严格,且缓存策略不同,容易暴露权限死角。
- 改完权限后,务必切换到生产环境跑一次完整请求(比如访问首页),看是否还有 500 或资源 404
- 检查
_runtime/logs/app.log里是否有Permission denied关键字 - 如果用了 OPcache 或 APCu,清空后再试,避免旧缓存掩盖新权限生效










