Apache 2.4 配置多域名指向不同目录,本质是利用基于名称的虚拟主机(Name-based Virtual Hosts)功能,通过为每个域名编写独立的<VirtualHost>配置块来实现,这是官方推荐的标准做法。
先说结论:Apache 2.4 原生支持多域名配置,不需要额外模块,重点在于正确设置 ServerName 和 DocumentRoot 并确保权限无误。
- 适合:单台服务器需要托管多个不同域名的网站场景。
- 先准备:确认域名已解析到服务器 IP,且服务器 80 或 443 端口未被占用。
- 验收:使用 curl 命令模拟 Host 头请求,确认返回内容对应正确的目录。
多域名配置示例
下面是一个典型的多虚拟主机配置片段,展示了两个域名分别指向不同目录的结构。注意路径和域名需要替换为实际值。
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/example
<Directory /var/www/example>
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.test.com
ServerAlias test.com
DocumentRoot /var/www/test
<Directory /var/www/test>
Require all granted
</Directory>
</VirtualHost>工作原理
Apache 处理请求时,会读取 HTTP 请求头中的 Host 字段,然后匹配配置文件中 ServerName 或 ServerAlias 一致的 VirtualHost 块。在 Apache 2.2 时代需要配置 NameVirtualHost 指令,但在 2.4 版本中该指令已废弃,只要使用 IP:Port 或*:Port 形式定义 VirtualHost,默认就是基于名称的虚拟主机。
实施步骤
1. 确认配置加载路径:检查主配置文件 httpd.conf 中是否包含 Include 指令。通常在文件末尾会有类似 IncludeOptional conf.d/*.conf 的配置。如果没有,新建的配置文件不会被加载。
2. 准备目录:为每个网站创建独立的文件夹,并设置好权限,确保 Apache 运行用户(如 apache 或 www-data)有读取权限。
3. 编写配置:在 conf.d 目录下新建配置文件(需确保 httpd.conf 已包含 IncludeOptional conf.d/*.conf),填入 VirtualHost 块,每个域名一个块。
4. 检查语法:运行 apachectl configtest 或 httpd -t 确保没有拼写错误,避免重启失败。
5. 重启服务:执行 systemctl restart httpd 或 apache2 使配置生效,生产环境建议先 reload。
验证方法
不要直接在浏览器输入 IP 访问,因为浏览器默认发送的是 IP 地址作为 Host。建议在终端使用 curl 命令指定 Host 头进行测试,例如 curl -H "Host: www.example.com" http://服务器 IP/。同时查看 access_log 日志,确认请求被记录到了对应的虚拟主机日志中。
常见故障排查
1. 权限问题:DocumentRoot 目录如果没有读取权限,会返回 403 Forbidden,需检查 SELinux 或文件系统权限。
2. 默认主机:如果没有匹配到任何 ServerName,请求会落入第一个定义的 VirtualHost,通常建议显式配置一个默认站点。
3. 端口监听:确保 httpd.conf 中 Listen 指令包含了你配置的端口,否则 Apache 不会监听该端口。
4. 配置未生效:确认配置文件是否被 httpd.conf 通过 Include 指令引入,且文件名后缀通常为 .conf。
参考来源
Apache HTTP Server 官方文档 - Virtual Host Examples
URL: https://httpd.apache.org/docs/2.4/vhosts/examples.html