You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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
    
  • 分别在两个站点的脚本里测试:
    1. 尝试写入自身目录和日志目录(应该成功)
    2. 尝试读取/写入另一个站点的目录(应该被拒绝)

这样就能完美实现你要的权限隔离效果啦!

内容的提问来源于stack exchange,提问作者LSG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:06:40