Apache 2.4 通过 httpd.conf 或独立配置文件中添加多个<VirtualHost>块来实现多域名绑定不同目录,每个块需指定 ServerName 和 DocumentRoot。配置生效前必须检查语法并重启服务,风险主要集中在目录权限和 SELinux 限制。
先说结论:Apache 2.4 配置多域名绑定目录的核心是为每个域名建立独立的<VirtualHost>容器,并正确设置访问权限。
- 适合:需要在同一 IP 和端口上托管多个不同域名的网站场景。
- 先准备:确认 Apache 版本为 2.4+,规划好域名对应的物理目录路径。
- 验收:使用 apachectl configtest 检查语法,通过 curl 携带 Host 头验证解析。
命令速用版
以下配置片段可直接放入 httpd.conf 或 sites-enabled 目录下的配置文件中,注意替换域名和路径。
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot "/var/www/example"
<Directory "/var/www/example">
Require all granted
</Directory>
</VirtualHost>为什么会这样
Apache 2.4 基于名称的虚拟主机工作原理是读取 HTTP 请求头中的 Host 字段来匹配对应的 VirtualHost 块。
服务器监听指定端口后,会根据客户端请求的域名查找匹配的 ServerName 或 ServerAlias,从而将请求引导至指定的 DocumentRoot 目录。如果未匹配到任何虚拟主机,Apache 会使用配置文件中最先加载的那个 VirtualHost 作为默认主机。
分步处理
按照以下顺序操作可确保配置生效且不影响现有服务。
- 创建目录:在服务器上为每个域名创建独立的网站目录,例如
mkdir -p /var/www/example。 - 设置权限:确保 Apache 运行用户(如 www-data 或 apache)有读取权限,执行
chown -R apache:apache /var/www/example。 - 编辑配置:打开主配置文件或包含文件,添加上述 VirtualHost 块。CentOS 通常在
/etc/httpd/conf.d/,Ubuntu 通常在/etc/apache2/sites-available/。 - 检查语法:执行
apachectl configtest或apache2ctl configtest,确保返回 Syntax OK。 - 重启服务:执行
systemctl restart httpd或systemctl restart apache2加载新配置。
怎么验证是否生效
验证核心是确认不同域名请求是否返回了对应目录下的内容。
- 本地测试:使用 curl 命令模拟请求,
curl -H "Host: www.example.com" http://服务器 IP,观察返回内容是否为该域名目录下的文件。 - 日志检查:查看访问日志
tail -f /var/log/httpd/access_log,确认请求被记录且状态码为 200。 - 浏览器访问:配置本地 hosts 文件指向服务器 IP,直接在浏览器输入域名访问。
常见坑
配置过程中最容易出错的是权限控制和语法版本差异。
- 2.2 与 2.4 语法混用:Apache 2.4 必须使用
Require all granted,旧版Order allow,deny会导致 403 错误。 - SELinux 限制:CentOS/RHEL 系统若开启 SELinux,需执行
chcon -R -t httpd_sys_content_t /var/www/example否则无法读取。 - 默认主机冲突:第一个加载的 VirtualHost 会成为默认主机,未匹配域名的请求都会落入该目录,需确保顺序正确或设置默认页。
常见问题
配置后访问域名显示默认页怎么办
通常是 DNS 未解析或 VirtualHost 顺序问题。
检查本地 hosts 文件是否绑定正确 IP,确认配置文件中该域名的 VirtualHost 块没有被其他默认块覆盖,必要时将默认站点配置放在最后加载。
如何配置 HTTPS 多域名绑定
需要为每个域名配置独立的 SSL 证书并在 443 端口建立 VirtualHost。
启用 mod_ssl 模块,复制 80 端口配置块改为 443 端口,添加 SSLEngine on、SSLCertificateFile 和 SSLCertificateKeyFile 指令指向对应证书文件。
参考来源
- Apache HTTP Server Documentation, Name-based Virtual Host Support, https://httpd.apache.org/docs/2.4/vhosts/name-based.html
- Apache HTTP Server Documentation, <VirtualHost> Directive, https://httpd.apache.org/docs/2.4/mod/core.html#virtualhost