典型报错是 mkdir(): Permission denied 或 Disk quota exceeded,主因是www用户权限不足或磁盘配额超限;需检查父目录x权限、PHP进程实际UID、open_basedir限制及quota配置。

网站目录创建失败的典型报错是什么
看到 mkdir(): Permission denied 或者 failed to open stream: Disk quota exceeded 就基本能锁定问题方向——不是单纯缺权限,就是磁盘配额卡死了。宝塔默认用 www 用户跑 PHP 和 Nginx,但新建站点时如果没选“自动创建目录”,或者手动上传后没同步改属主,www 就根本写不进子目录;而配额超限往往藏得更深:看起来磁盘还有 20GB 空闲,但用户级配额早就满了。
chown -R www:www 不一定管用
直接对网站根目录执行 chown -R www:www /www/wwwroot/example.com 是常见操作,但它只解决属主问题,漏掉两个关键点:
-
www用户必须有父目录的x(执行)权限才能进入下级目录,比如/www/wwwroot权限是750且组不是www,www用户照样进不去 - PHP-FPM 进程实际以
www身份运行,但某些宝塔版本会把子进程降权到www-data或其他用户,这时改www属主反而无效 - 如果开启了“防跨站攻击”,宝塔会在
php.ini里加open_basedir,限制 PHP 只能访问指定路径,递归创建时一出范围就静默失败
检查并重置用户磁盘配额
配额问题在 CentOS 7+/Rocky 8+ 上尤其隐蔽,因为宝塔安装时可能自动启用了 quota,但没给提示。验证方式很简单:
quota -u www
如果输出类似 Disk quotas for user www (uid 1001): Filesystem blocks quota limit grace files quota limit grace /dev/vda1 2097152* 2097152 0 0 0 0,末尾带 * 表示已超限。修复步骤如下:
- 临时清空配额:
setquota -u www 0 0 0 0 /dev/vda1(把数字全设为 0 表示不限制) - 确认配额服务在运行:
quotaon -v /dev/vda1,如果报device is not mounted with quota option,需编辑/etc/fstab,在对应分区参数里加上usrquota - 宝塔后台的“安全”→“磁盘配额”开关建议关闭,除非你真需要按用户隔离空间
递归创建目录前必须确认的三件事
别急着写 mkdir -p,先盯住这三项:
- 目标路径的最上级目录(如
/www/wwwroot)是否对www用户可写?用namei -l /www/wwwroot/example.com查每一级权限 - 当前 PHP 进程实际 UID 是多少?在网站根目录放个
info.php,内容为<?php echo posix_getuid(); ?>,再对比id -u www输出是否一致 - 宝塔网站设置里的“运行目录”是否填错了?比如填成
/www/wwwroot/example.com/public,但代码实际放在/www/wwwroot/example.com,PHP 就会从public开始找,导致创建路径偏移
配额和权限这两层像套娃,一层没解开,下一层的错误信息全是干扰项。动手前先 quota -u www 和 ls -ld /www/wwwroot 看一眼,比盲目 chown 快得多。

















