如何配置VirtualHost权限:允许指定站点访问日志站点并互斥访问
Apache VirtualHost 跨目录权限控制方案
嘿,这个权限控制需求其实可以通过系统用户组权限+Apache模块配置来完美实现,我给你一步步拆解方案:
第一步:创建独立的系统用户与用户组
我们需要给两个站点分配独立的系统身份,同时让它们共享日志目录的访问权限:
- 给
example1.com创建专属用户和组:groupadd example1 && useradd -g example1 -d /var/www/example1.com -s /sbin/nologin example1 - 给
example2.com创建专属用户和组:groupadd example2 && useradd -g example2 -d /var/www/example2.com -s /sbin/nologin example2 - 创建共享日志目录的用户组,并把两个站点用户加进去:
groupadd example_log && usermod -aG example_log example1 && usermod -aG example_log example2
第二步:设置目录权限
通过文件系统权限实现基础隔离:
- 配置
example1.com目录权限,确保只有自身用户/组能访问:chown -R example1:example1 /var/www/example1.com && chmod -R 750 /var/www/example1.com - 配置
example2.com目录权限,同理:chown -R example2:example2 /var/www/example2.com && chmod -R 750 /var/www/example2.com - 配置日志目录权限,让两个站点用户都能读写:
chown -R root:example_log /var/www/example1-example2-log.com && chmod -R 770 /var/www/example1-example2-log.com
解释:
750权限意味着用户拥有读写执行权限,组拥有读执行权限,其他用户完全无权;770则让用户和组都拥有完整的读写执行权限,刚好满足两个站点共享日志目录的需求。
第三步:修改VirtualHost配置
用mod_itk模块让每个站点以专属用户运行,同时通过PHP配置进一步限制访问范围:
<VirtualHost *:80> ServerName example1.com DocumentRoot /var/www/example1.com/public_html # 指定站点运行的用户和组 AssignUserID example1 example1 # PHP层面限制只能访问自身目录和日志目录 php_admin_value open_basedir "/var/www/example1.com:/var/www/example1-example2-log.com" </VirtualHost> <VirtualHost *:80> ServerName example2.com DocumentRoot /var/www/example2.com/public_html AssignUserID example2 example2 php_admin_value open_basedir "/var/www/example2.com:/var/www/example1-example2-log.com" </VirtualHost> <VirtualHost *:80> ServerName example1-example2-log.com DocumentRoot /var/www/example1-example2-log.com/public_html # 日志站点可设为root或专属用户,这里用共享组确保权限兼容 AssignUserID root example_log </VirtualHost>
提示:如果你的Apache没加载
mod_itk,需要先启用它(比如Debian/Ubuntu下执行a2enmod itk,然后重启Apache)。如果不想用mod_itk,也可以用mod_suexec,但配置复杂度会高一些。
第四步:验证配置
- 重启Apache使配置生效:
systemctl restart apache2 - 分别在两个站点的脚本里测试:
- 尝试写入自身目录和日志目录(应该成功)
- 尝试读取/写入另一个站点的目录(应该被拒绝)
这样就能完美实现你要的权限隔离效果啦!
内容的提问来源于stack exchange,提问作者LSG
相关产品推荐
相关产品推荐

