Apache通过虚拟主机机制、独立配置文件、严格权限控制及分离日志与PHP环境实现基于域名的项目隔离,确保各站点在文档根目录、访问控制、日志记录和运行环境上完全独立互不干扰。

Apache 本身不靠 httpd.conf 单文件实现“隔离”,而是通过启用虚拟主机机制 + 分离配置 + 权限控制来达成基于域名的项目隔离。关键不在写多少行,而在结构是否分得清、权限是否卡得严、日志和运行环境是否互不干扰。
1. 启用虚拟主机主开关并分离配置入口
在 httpd.conf 中确保以下两行已取消注释(尤其注意 NameVirtualHost 在 Apache 2.4+ 已被移除,无需配置):
-
LoadModule mpm_event_module modules/mod_mpm_event.so(或mpm_prefork,根据 PHP 运行方式选) Include conf/extra/httpd-vhosts.conf
不要把所有站点都堆在 httpd.conf 里。把每个域名的完整 <VirtualHost> 块统一写进 conf/extra/httpd-vhosts.conf 或拆成独立文件(如 conf/vhosts/site1.conf),再用 Include conf/vhosts/*.conf 加载——便于维护、避免单文件臃肿出错。
2. 每个域名必须有独立的 DocumentRoot 和权限归属
例如为 blog.example.com 配置:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
DocumentRoot "/var/www/blog"—— 路径不能与其他站点共用,也不能是上级目录(如/var/www) -
<Directory "/var/www/blog">块中明确限制:Require all denied(默认拒绝)Require all granted(仅对当前目录开放)Options -FollowSymLinks -Indexes(禁符号链接、禁目录列表)AllowOverride None(禁 .htaccess 覆盖,防配置绕过) - 执行:
chown -R www-data:www-data /var/www/blog,确保该目录不属于 root 或其他站点用户
3. 日志、错误输出与 PHP 环境必须一一对应
每个 <VirtualHost> 内必须显式指定:
ErrorLog "/var/log/httpd/blog-error.log"CustomLog "/var/log/httpd/blog-access.log" combined- 若用 PHP-FPM,需配专属池(如
pool.d/blog.conf),并在虚拟主机中指定:ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/var/www/blog/
或更推荐 socket 方式:ProxyPassMatch ^/(.*\.php)$ unix:/var/run/php/blog.sock|fcgi:///var/www/blog/
这样即使两个站点都跑 PHP,也不会因共用进程或缓存导致 session 混淆、opcache 冲突或配置覆盖。
4. 客户端访问前:hosts 或 DNS 必须对齐
开发或测试环境需改本地 /etc/hosts(Linux/macOS)或 C:\Windows\System32\drivers\etc\hosts(Windows):
127.0.0.1 blog.example.com127.0.0.1 api.example.com
生产环境则需 DNS 解析到服务器公网 IP,并确保防火墙放行 80/443 端口。Apache 不会“猜”域名——请求头里的 Host 字段必须和 ServerName 或 ServerAlias 完全匹配,否则可能落入第一个定义的虚拟主机或默认站点。

















