Apache配置多个域名绑定,本质是启用基于名称的虚拟主机,为每个域名建立独立的 VirtualHost 配置块,让一台服务器根据请求头中的 Host 字段分发到对应网站目录。
实际部署中,很多人第一次接触 Apache 多域名时,容易把 ServerName、ServerAlias、DocumentRoot 三者的关系搞混,下文从零开始拆解配置逻辑,并覆盖本地测试、生产 HTTPS、故障排查等常见场景。
Apache虚拟主机配置多个域名的前置条件
开始前先确认三件事:Apache 版本、模块状态、域名解析,这些条件不满足,配置文件写得再标准也不会生效。
确认 Apache 版本与配置入口
- 执行
apachectl -v或httpd -v查看版本。 - Apache 2.4 及之后的版本默认启用基于名称的虚拟主机,不再需要显式写
NameVirtualHost :80。 - Apache 2.2 以前如果绑定多个域名,必须在配置文件中加上
NameVirtualHost :80。 - 主配置文件常见路径:
- Debian/Ubuntu:
/etc/apache2/apache2.conf - RHEL/CentOS:
/etc/httpd/conf/httpd.conf
- Debian/Ubuntu:
- 虚拟主机配置通常放在:
- Debian/Ubuntu:
/etc/apache2/sites-available/ - RHEL/CentOS:
/etc/httpd/conf.d/
- Debian/Ubuntu:
据 Apache 官方文档,基于名称的虚拟主机依赖客户端请求头中的 Host 字段,由服务器把该字段与 ServerName 或 ServerAlias 进行匹配,这一步是后续所有配置的基础。
域名解析与目录权限准备
- 在域名服务商处将每个域名的 A 记录指向服务器公网 IP。
- 如果是本地测试环境 Apache 多域名配置,可以直接修改本机 hosts 文件,把多个域名都指向
0.0.1。 - 创建每个域名对应的网站根目录,
mkdir -p /var/www/example.com/public_html
mkdir -p /var/www/blog.example.com/public_html
- 确认 Apache 运行用户对目录有读取权限,多数情况下目录权限设置为
755即可。
Apache不同域名指向不同目录的配置方法
这是整个多域名绑定的核心操作,每个域名一个 VirtualHost 块,块内写清域名、别名、目录、日志路径。
基础配置示例
以下示例用两个域名说明,一个主域名带 www,一个二级域名独立运行:
<Vir
tualHost :80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/example-error.log
CustomLog ${APACHE_LOG_DIR}/example-access.log combined
</VirtualHost>
<VirtualHost :80>
ServerName blog.example.com
DocumentRoot /var/www/blog.example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/blog-error.log
CustomLog ${APACHE_LOG_DIR}/blog-access.log combined
</VirtualHost>
关键指令解释
ServerName:主域名,Apache 用它与请求 Host 字段做匹配。ServerAlias:该站点的其他可用域名,比如把example.com作为www.example.com的别名。DocumentRoot:该域名对应的网站根目录,是实现 Apache不同域名指向不同目录 的关键路径。ErrorLog与CustomLog:建议每个虚拟主机使用独立日志文件,出问题时更容易定位。
启用配置并重启
Debian/Ubuntu 系统:
a2ensite example.conf
systemctl reload apache2
RHEL/CentOS 系统通常直接放在 conf.d 目录下即可生效,同样执行:
systemctl reload httpd
配置生效后,可以用 apachectl -S 查看当前虚拟主机列表和匹配顺序。
Apache多域名SSL证书配置要点
HTTPS 环境下,多个域名共用同一个 IP 时,需要依赖 SNI 支持,行业共识认为,启用 SNI 是当前最成熟的单 IP 多域名 HTTPS 方案。
SNI 与证书绑定
- Apache 从 2.2.12 版本开始支持 SNI。
- 每个域名都需要独立的 443 端口 VirtualHost 块。
- 示例:
<VirtualHost :443>
ServerName www.example.com
DocumentRoot /var/www/example.com/public_html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.crt
SSLCertificateKeyFile /etc/ssl/private/example.key
SSLCertificateChainFile /etc/ssl/certs/example-chain.crt
</VirtualHost>
<VirtualHost :443>
ServerName blog.example.com
DocumentRoot /var/www/blog.example.com/public_html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/blog.crt
SSLCertificateKeyFile /etc/ssl/private/blog.key
SSLCertificateChainFile /etc/ssl/certs/blog-chain.crt
</VirtualHost>
- 如果某个旧客户端不支持 SNI,Apache 会回退到默认虚拟主机,导致证书不匹配,多数现代浏览器和操作系统均已支持 SNI,这一情况越来越少。
证书申请与泛域名选择
- 如果多个二级域名同属一个主域,
www.example.com、blog.example.com、api.example.com,可以选择泛域名证书,只配置一份证书路径,简化维护。 - 如果域名之间完全独立,则必须为每个域名单独申请证书并在对应虚拟主机块中引用。
- 本地测试环境可以不配置 SSL,优先调试 80 端口逻辑;生产环境建议强制跳转 HTTPS。
Apache一台服务器绑定多个域名的检查清单
配置完成后,出现访问异常时,按以下顺序排查,业内专家指出,虚拟主机问题多数出在 ServerName 不匹配、配置文件未启用或 DNS 解析未生效。
站点点检查清单
- 执行
apachectl -S,确认每个域名都出现在虚拟主机列表中。 - 确认所有域名 A 记录已指向当前服务器 IP。
- 使用
curl -H "Host: blog.example.com" http://127.0.0.1测试本机响应。 - 检查防火墙是否放行 80 或 443 端口。
- 查看每个站点的独立错误日志,Apache 通常会把匹配失败原因写进去。
常见错误与修复
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 访问任何域名都进入第一个站点 | 缺少 ServerName 或 NameVirtualHost 未生效 | 检查配置、执行 reload、必要时重启 |
| 访问二级域名返回 404 | DocumentRoot 路径错误或目录不存在 | 核对路径,创建目录并赋权 |
| HTTPS 域名证书显示错误 | SNI 未启用或默认虚拟主机配置不全 | 确认 Apache 版本,补充 443 默认块 |
| 配置不生效 | Debian 系统未执行 a2ensite | 执行 a2ensite 后再 reload |
| 本地测试无法访问 | hosts 文件未修改或浏览器缓存 | 刷新 DNS 缓存,确认 hosts 格式 |
性能与安全建议
- 每个虚拟主机独立日志文件,避免单个日志过大影响诊断。
- 生产环境关闭目录列表功能,设置
Options -Indexes。 - 多个网站共用一台服务器时,做好资源隔离,必要时配置 PHP 池或目录权限。
-
不要把所有域名都指向同一个 DocumentRoot,这样会把内容和数据耦合在一起,后期迁移成本很高。
本地测试环境Apache多域名配置示例
不少个人开发者在本地同时开发多个项目,希望能用不同域名访问不同目录,这种场景和线上服务器配置思路一致,只是域名解析方式不同。
操作步骤
- 编辑 hosts 文件:
- Linux/macOS:
/etc/hosts - Windows:
C:WindowsSystem32driversetchosts
- Linux/macOS:
- 添加映射:
0.0.1 www.test.com
127.0.0.1 blog.test.com
127.0.0.1 api.test.com
- 在 Apache 中为这三个域名分别建立 VirtualHost 块,DocumentRoot 指向不同项目目录。
- reload Apache 后,浏览器直接访问
www.test.com、blog.test.com即可打开对应本地项目。
这种本地测试方案几乎不用额外成本,适合个人开发者同时调试多个网站。
关于apache配置多个域名绑定的常见问题
Apache多域名配置和Nginx多域名配置有什么区别?
两者都支持基于名称的虚拟主机,核心逻辑都是匹配请求头中的 Host 字段,区别在于配置文件结构和语法不同,Apache 使用多个 VirtualHost 块,Nginx 使用多个 server 块,Apache 的配置更直观,学习曲线相对平缓;Nginx 在高并发下的内存占用通常更低,如果已经熟悉 Apache,本地多域名绑定用 Apache 完全够用。
Apache配置多个域名后访问总是跳转到第一个站点怎么办?
多数情况下是因为请求的域名没有匹配到任何 ServerName 或 ServerAlias,Apache 自动回退到第一个定义的虚拟主机,先执行 apachectl -S 查看虚拟主机顺序和匹配规则,再确认访问的域名是否在某个 ServerName 或 ServerAlias 中,如果是 Apache 2.2,检查是否遗漏 NameVirtualHost :80,如果都正确,最后检查 hosts 文件或 DNS 解析是否真的把域名指向了该服务器。
Apache多域名绑定需要独立IP吗?
不需要,基于名称的虚拟主机可以让多个域名共享同一个 IP,HTTPS 场景下,只要客户端支持 SNI,多个域名也能共享同一个 IP 并分别使用独立证书,只有极少数老设备不支持 SNI 时,才需要用独立 IP 或多 IP 方案解决,当前主流浏览器和移动设备均已支持 SNI,独立 IP 不再是多域名绑定的前置条件。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/653170.html





