apache基于名称的虚拟主机通过host请求头将同一ip和端口的请求分发到不同目录,需启用httpd-vhosts.conf、配置、设置servername与本地hosts映射,并重启服务验证。

Apache 基于名称的虚拟主机(Name-based Virtual Host)是单 IP 托管多个网站最常用的方式。它不依赖额外 IP,而是靠浏览器发来的 Host 请求头做路由判断,只要 DNS 把不同域名都解析到同一服务器 IP,Apache 就能按需分发请求。
确认基础服务已就绪
确保 Apache 正在运行,且监听 80 端口:
- 检查状态:
sudo systemctl status httpd(CentOS/RHEL)或sudo systemctl status apache2(Debian/Ubuntu) - 确认监听:
sudo ss -tlnp | grep :80,应看到 httpd 或 apache2 进程绑定在*:80或:::80 - 若未启用虚拟主机支持,编辑主配置(如
/etc/httpd/conf/httpd.conf或/etc/apache2/apache2.conf),取消注释以下两行(若存在):Include conf/extra/httpd-vhosts.confListen 80
准备网站目录与测试页
为每个域名建独立根目录,避免内容混用:
- 新建目录:
sudo mkdir -p /var/www/site-a /var/www/site-b - 写入区分性首页:
echo "<h1>Welcome to site-a.example</h1>" | sudo tee /var/www/site-a/index.htmlecho "<h1>Welcome to site-b.example</h1>" | sudo tee /var/www/site-b/index.html - 设置权限(以 CentOS 为例):
sudo chown -R $USER:apache /var/www/site-*
Debian/Ubuntu 则用www-data替换apache
编写虚拟主机配置块
在虚拟主机配置文件中(如 /etc/httpd/conf/extra/httpd-vhosts.conf 或 /etc/apache2/sites-available/site-a.conf)添加如下结构:
- 每个站点一个
<virtualhost></virtualhost>块,必须包含ServerName(主域名)和DocumentRoot - 可选加
ServerAlias支持别名,例如www.site-a.example - 示例配置:
<virtualhost><br> ServerName site-a.example<br> ServerAlias www.site-a.example<br> DocumentRoot "/var/www/site-a"<br> <directory><br> Require all granted<br> </directory><br></virtualhost>
- Apache 2.4+ 不再需要
NameVirtualHost *:80指令,但第一个<virtualhost></virtualhost>会自动成为默认虚拟主机 —— 所有未匹配域名的请求都会落到它身上,建议把它设为兜底或监控页
本地测试与生效验证
无需公网 DNS,用 /etc/hosts 模拟解析即可验证:
- 编辑 hosts 文件:
sudo nano /etc/hosts - 添加两行:
127.0.0.1 site-a.example127.0.0.1 site-b.example - 重启 Apache:
sudo systemctl restart httpd或sudo systemctl restart apache2 - 在浏览器分别访问
http://site-a.example和http://site-b.example,应显示对应首页 - 额外验证:执行
sudo apachectl -S可查看当前加载的虚拟主机列表及匹配顺序











