Apache虚拟主机通过IP、域名或端口实现单服务器多站点隔离;基于域名最常用,依赖Host头识别;基于端口适合内部服务分离;基于IP提供网络层硬隔离,需服务器绑定多个IP。

Linux 下用 Apache 部署多个网站,核心是靠虚拟主机(VirtualHost)机制实现隔离。不依赖额外硬件,单台服务器就能跑多个独立站点,关键在于选对方式——基于域名、端口或 IP,每种适用场景不同,配置逻辑也各异。
基于域名的虚拟主机(最常用)
这是生产环境首选,用户通过不同域名访问同一 IP 上的不同网站,靠 HTTP 请求头中的 Host 字段区分站点。
- 确保每个域名已解析到服务器公网 IP(如 site1.com → 203.0.113.10)
- 为每个站点建独立目录:
sudo mkdir -p /var/www/site1.com /var/www/site2.com,并放入测试页 - 在
/etc/apache2/sites-available/(Debian/Ubuntu)或/etc/httpd/conf.d/(RHEL/CentOS)下创建配置文件,例如:
<VirtualHost *:80>
ServerName site1.com
ServerAlias www.site1.com
DocumentRoot /var/www/site1.com
<Directory /var/www/site1.com>
Require all granted
</Directory>
</VirtualHost>
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 启用配置:
sudo a2ensite site1.com.conf(Debian系)或直接放好 conf 文件(RHEL系需确保被主配置 include) - 重启前务必检查语法:
sudo apache2ctl configtest或sudo apachectl configtest
基于端口的虚拟主机(适合内部服务分离)
当域名不便或需快速区分用途(如后台、API、前端),可用不同端口承载不同站点,无需 DNS 配合。
- 先在主配置中声明监听端口,例如编辑
/etc/apache2/ports.conf或/etc/httpd/conf/httpd.conf,添加:Listen 8000Listen 8080 - 每个站点单独写
<VirtualHost *:8000>和<VirtualHost *:8080>块,不能共用同一端口写多个 ServerName - 注意防火墙放行对应端口:
sudo ufw allow 8000(Ubuntu)或sudo firewall-cmd --add-port=8080/tcp --permanent(CentOS)
基于 IP 的虚拟主机(网络层硬隔离)
适用于内网多网段分发、严格隔离测试环境,或需绕过 DNS 和 Host 头校验的场景。Apache 直接按 TCP 目标 IP 匹配,不看域名。
- 服务器必须绑定多个 IP:临时加法
sudo ip addr add 192.168.1.101/24 dev eth0;永久加法需配置网卡别名(如ifcfg-eth0:0) - 每个 VirtualHost 必须写死 IP 和端口,例如:
<VirtualHost 192.168.1.100:80>,禁用通配符 * - 对应目录权限设对:
sudo chown -R $USER:www-data /var/www/site-ip1(Ubuntu)或sudo chown -R $USER:apache /var/www/site-ip2(CentOS) - 验证 IP 是否生效:
ip addr show eth0 | grep inet应看到所有已配 IP
通用收尾与排错要点
无论哪种方式,最后几步都不可跳过:
- 语法检查通过后,再重启服务:
sudo systemctl reload apache2(推荐 reload,平滑生效) - 浏览器访问时,若 403 错误,多半是 Directory 权限没开全(
Require all granted缺失) - 访问超时或拒绝连接,优先查防火墙和 Listen 端口是否匹配,再确认 VirtualHost 的 IP/端口是否与请求一致
- 日志是第一线索:
tail -f /var/log/apache2/error.log或/var/log/httpd/error_log

















