apache虚拟主机本身不提供进程级或资源级隔离,其“隔离”是逻辑层面的,需结合documentroot权限控制、独立日志、php-fpm池隔离及dns/hosts对齐等多层机制实现项目间互不干扰。

Apache 虚拟主机本身不提供进程级或资源级隔离,它的“隔离”是逻辑层面的——通过请求匹配规则,把不同域名、IP 或端口的流量路由到各自独立的配置和文件目录。真正实现项目间互不干扰,需要结合路径、权限、日志、PHP 运行环境等多层配合。
文档根目录与访问权限隔离
每个虚拟主机必须指定唯一的 DocumentRoot,且该目录不能被其他站点共享或递归访问。
- 确保各站点根目录归属不同用户(如
chown -R site1:site1 /var/www/site1),避免跨站读写 - 在
<directory></directory>块中禁用符号链接和覆盖:Options -FollowSymLinks<br>AllowOverride None<br>Require all denied
(再按需对特定目录开放) - 禁止父目录遍历:Apache 默认不允许多级向上跳转,但要检查
DocumentRoot是否位于系统敏感路径下(如/etc或/home用户主目录)
日志与错误分离
每个虚拟主机应使用独立的日志文件,便于排查问题且防止日志混杂。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 为每个
<virtualhost></virtualhost>显式定义:ErrorLog "/var/log/httpd/site1-error.log"<br>CustomLog "/var/log/httpd/site1-access.log" combined
- 日志目录需由 Apache 用户(如
apache或www-data)可写,但其他用户不可写 - 建议启用日志轮转(如
logrotate),避免单个日志无限增长
PHP 版本与运行环境隔离
若项目依赖不同 PHP 版本,不能靠 mod_php 实现共存,必须用 php-fpm + mod_proxy_fcgi。
- 为每个站点配置独立的 PHP-FPM 池(如
/etc/php/8.1/fpm/pool.d/site1.conf),监听不同 socket 或端口 - 在虚拟主机中指定对应处理器:
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/var/www/site1/$1
或更推荐 Unix socket:ProxyPassMatch ^/(.*\.php)$ unix:/run/php/php8.1-fpm-site1.sock|fcgi:///var/www/site1/ - PHP-FPM 池中设置
user、group和chroot(可选),进一步限制脚本执行边界
DNS 或 hosts 层面对齐(开发/测试场景)
基于域名的虚拟主机依赖 Host 头匹配,本地验证时无需真实 DNS:
- 编辑
/etc/hosts添加映射:127.0.0.1 site1.local<br>127.0.0.1 site2.local
- Apache 配置中
ServerName必须与请求 Host 一致,否则会 fallback 到第一个匹配的虚拟主机 - 避免通配符滥用(如
ServerName *),应明确写ServerName site1.local并配ServerAlias www.site1.local










