多站点目录权限冲突根源在于php进程用户、文件属主、open_basedir三者未对齐:需为每个站点创建独立php-fpm pool及专用系统用户(如site1_user),chown -r site1_user:site1_user绑定目录,同步修改pool配置中user/group/listen.owner/listen.group,并在open_basedir中显式添加站点根目录、/tmp、/var/tmp及共享路径,重启php实例生效。

多站点目录权限冲突不是配置写错了,而是 PHP 进程用户、文件属主、open_basedir 三者没对齐。 宝塔或手动部署下,只要两个站点共用一个 PHP-FPM 实例或共享目录路径,就极易触发 Permission denied 或 open_basedir restriction in effect 错误——哪怕你 chmod 777 了也没用。
确认 PHP 进程实际运行用户是谁
别信面板显示的“www”或“nginx”,得看真实配置。PHP-FPM 每个 pool 可能用不同用户,而 Web 服务器(Nginx/Apache)只是转发请求,不决定权限主体。
- 查当前站点用的 pool 配置:进宝塔【PHP管理】→ 点击对应 PHP 版本 → 【设置】→ 【服务管理】→ 【编辑配置文件】,找
[www-site1]这类段落里的user和group值 - 终端验证:执行
ps aux | grep php-fpm,看 worker 进程实际以哪个用户启动(例如site1_user) - 如果所有站点都指向同一个 pool(如默认
[www]),那它们天然共享用户上下文,权限必然打架——必须拆 pool
每个站点根目录必须与 PHP-FPM 用户严格一对一绑定
这是隔离的底层前提。chown 不是“修一下”,而是“按需配对”。目录属主错一位,fopen() 就可能失败,尤其 PHP 8.4 对 open_basedir 校验更严。
- 先建专用用户:
useradd -s /sbin/nologin site1_user(禁止登录,仅用于进程) - 改目录归属:
chown -R site1_user:site1_user /www/wwwroot/site1.com - 同步改 pool 配置中的
user、group、listen.owner、listen.group全部设为site1_user - 重启该 PHP 实例(不是 reload):宝塔里点【服务管理】→ 【重启】,确保新用户生效
- 重复以上步骤为 site2.com 创建
site2_user,绝对不要复用
open_basedir 必须按站点单独设,且路径要包含 session 和 temp
PHP 8.4 默认启用 open_basedir,但宝塔界面里若只填根目录,session 写入、临时文件上传、Composer autoload 都会报错——因为这些路径不在白名单内。
- 进宝塔【网站】→ 【设置】→ 【PHP版本】→ 【配置修改】,找到
open_basedir行 - 填完整路径,用冒号分隔(Linux):
/www/wwwroot/site1.com:/tmp:/var/tmp:/opt/php84/lib/php - 其中
/tmp和/var/tmp是 session.save_path 和 upload_tmp_dir 常用位置,漏掉就会session_start(): open_basedir restriction - 别用
.或./,PHP 8.4 已不支持相对路径写法;也别留空,空值等于禁用全部路径
共享目录(如 uploads、cache)必须用组权限 + setgid 解决跨站点写入
如果多个站点要写同一个目录(比如 CMS 的附件库),不能靠 chown 到单一用户,得靠组继承 + 权限掩码控制。
- 建共享组:
groupadd shared_web - 把各站点用户加进组:
usermod -a -G shared_web site1_user、usermod -a -G shared_web site2_user - 设共享目录属组和 setgid:
chown -R :shared_web /www/shared+chmod g+s /www/shared - 设 umask(在 PHP 入口加
umask(0002)),保证新文件组可写;再用chmod -R 775 /www/shared(目录)和664(文件) - 关键:每个站点的
open_basedir必须显式包含该共享路径,否则 PHP 层直接拦截
最易被忽略的是:PHP-FPM pool 重启后,旧进程可能残留几秒,导致你改完配置却仍复现旧错误;还有就是宝塔“权限修复”工具会暴力覆盖你精心设置的 site1_user 属主——它只认 www。动手前先关掉自动修复,改完再手动验证 ps aux | grep site1_user 和 ls -ld /www/wwwroot/site1.com。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











