目录权限与写入失败
安装、上传、写配置时报“无权限/不可写”的原因与修复,含属主、权限、SELinux 与磁盘空间。
一、现象
常见提示有:安装向导提示某目录不可写、后台保存设置失败、上传图片报错、生成缓存或站点地图失败、页面出现 Permission denied。这类问题的根因只有一个:PHP 运行用户对该路径没有写权限。
二、先确认运行用户
PHP-FPM 的运行用户决定谁需要写权限,宝塔面板下通常是 www。先核对:
ps aux | grep php-fpm | head # 看进程的运行用户
ls -ld /www/wwwroot/你的域名
三、属主与权限的正确设值
chown -R www:www /www/wwwroot/你的域名
find /www/wwwroot/你的域名 -type d -exec chmod 755 {} \;
find /www/wwwroot/你的域名 -type f -exec chmod 644 {} \;
按用途区分目录,最容易出问题的是这几个:
| 目录 | 作用 | 权限建议 |
|---|---|---|
upload/ | 上传附件 | 属主 www,755 |
data/ | 缓存、会话等运行数据 | 属主 www,755 |
config/ | 站点配置与路由 | 安装或保存设置时需可写,日常可收紧 |
install/ | 安装向导 | 安装期可写,装完立即删除或改名 |
提示:不要图省事把整站设为 777。777 等于向所有账户开放写权限,是被挂马的常见入口,务必避免。
四、权限正常却仍写入失败
- SELinux:开启时会在文件权限之外再加一层限制。
getenforce显示 Enforcing 时,可临时设为宽容模式确认是否为它拦截,再决定长期策略。 - 磁盘或 inode 满:没有剩余空间时同样表现为写入失败。
df -h # 看剩余空间
df -i # 看 inode 是否耗尽
清理日志与过期附件可释放空间,定期清理的做法见「网站访问慢与性能优化」一篇。
五、验证写入
用运行用户身份写一个测试文件,能建能删即说明该目录权限正确:
sudo -u www touch /www/wwwroot/你的域名/upload/_t.php
ls -l /www/wwwroot/你的域名/upload/_t.php
rm -f /www/wwwroot/你的域名/upload/_t.php
若仍写入失败,用 ls -l 从站点根逐级检查到目标目录,确认每一级都有执行(x)权限——中间任何一级缺 x,即使目标目录本身是 755 也进不去。
六、常见提示对照表
| 页面提示 | 涉及目录 | 处理方向 |
|---|---|---|
| 安装向导提示目录不可写 | install/、config/ | 安装期授予 www 写权限 |
| 后台保存设置失败 | config/、data/ | 属主与权限、检查磁盘空间 |
| 上传图片报错 | upload/ | 属主 www、755,并检查 PHP 上传限制 |
| 缓存或站点地图生成失败 | data/ | 权限是否可写、inode 是否耗尽 |
按表定位到具体目录后,用第三节的命令统一修正属主与权限即可。