在虚拟机中用httpd搭建虚拟主机,核心就是三件事:装好httpd、为每个站点写VirtualHost、让域名解析指向这台虚拟机。 只要这三步走通,本地开发、内网演示、多站点隔离都能在一台虚拟机里完成,不必为每个项目单独开一台机器。
虚拟机里的httpd虚拟主机,本质是让一个Apache进程根据访问请求里的域名、端口或IP,把请求分发到不同网站目录,常见类型有三种,先选对模式再动手,后面少踩坑。
| 类型 | 配置依据 | 适用场景 | 注意点 |
|---|---|---|---|
| 基于域名 | ServerName | 多个站点共用80端口 | 需要hosts或DNS配合 |
| 基于端口 | Listen与VirtualHost端口 | 临时测试、内部工具 | 访问时要带端口号 |
| 基于IP | VirtualHost指定IP | 一台机器绑定多个IP | 虚拟机需配置多网卡或多IP |
据Apache官方文档,VirtualHost可以组合使用域名、端口和IP,但生产环境更常见的是基于域名,下面以CentOS/Rocky Linux系里的httpd为例,Ubuntu对应软件包叫apache2,配置目录略有差异。
虚拟机中httpd配置虚拟主机详细步骤:从安装到访问
别急着改配置文件,先把虚拟机网络和主机名理顺,本地用VMware或VirtualBox时,NAT模式适合自己访问,桥接模式适合让局域网同事访问,用ip addr确认虚拟机IP,比如168.56.101,后面hosts测试会用到。
环境准备与httpd安装
在CentOS/Rocky/AlmaLinux中执行:
sudo dnf install httpd -y sudo systemctl enable --now httpd sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload
如果是Ubuntu/Debian,对应命令是sudo apt install apache2 -y,服务名是apache2,站点配置通常放在/etc/apache2/sites-available/,用a2ensite启用,本文示例以httpd的/etc/httpd/conf.d/为主,思路完全一致。
安装后访问http://虚拟机IP,看到默认测试页说明httpd已经跑起来,此时先别加站点,确认防火墙和SELinux没有拦截80端口。
CentOS用httpd搭建基于域名的虚拟主机怎么操作
假设要建两个站点:site1.com和site2.com,先创建目录和测试首页:
sudo mkdir -p /var/www/site1.com/public_html sudo mkdir -p /var/www/site2.com/public_html echo "site1 ok" | sudo tee /var/www/site1.com/public_html/index.html echo "site2 ok" | sudo tee /var/www/site2.com/public_html/index.html sudo chown -R apache:apache /var/www/site1.com /var/www/site2.com sudo chmod -R 755 /var/www/site1.com /var/www/site2.com
接着新建/etc/httpd/conf.d/vhost.conf,写入两个VirtualHost:
<VirtualHost :80>
ServerName site1.com
ServerAlias www.site1.com
DocumentRoot /var/www/site1.com/public_html
ErrorLog /var/log/httpd/site1.com-error.log
CustomLog /var/log/httpd/site1.com-access.log combined
<Directory /var/www/site1.com/public_html>
Require all granted
</Directory>
</VirtualHost>
<VirtualHost :80>
ServerName site2.com
ServerAlias www.site2.com
DocumentRoot /var/www/site2.com/public_html
ErrorLog /var/log/httpd/site2.com-error.log
CustomLog /var/log/httpd/site2.com-access.log combined
<Directory /var/www/site2.com/public_html>
Require all granted
</Directory>
</VirtualHost>
保存后先做语法检查,再重启:
sudo apachectl configtest sudo systemctl restart httpd
如果启用了SELinux,目录上下文不对会出现403,用下面命令修正:
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/site1.com/public_html(/.)?" sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/site2.com/public_html(/.)?" sudo restorecon -Rv /var/www/site1.com/public_html /var/www/site2.com/public_html
没有安装semanage时,先装policycoreutils-python-utils,这一步是很多新手在虚拟机里配httpd虚拟主机时最容易漏掉的环节。
本地hosts与域名解析怎么配合测试
没有真实域名也能测,Windows修改C:\Windows\System32\drivers\etc\hosts,Linux修改/etc/hosts,加入:
168.56.101 site1.com www.site1.com 192.168.56.101 site2.com www.site2.com
然后在宿主机浏览器访问http://site1.com和http://site2.com,看到不同首页就说明基于域名的虚拟主机生效了,如果DNS还没生效,也可以用curl指定Host头:
curl -I -H "Host: site1.com" http://192.168.56.101
业内专家指出,本地开发用hosts模拟域名,比直接改端口更接近真实生产环境,后续迁移到内网DNS或公网解析时改动更小。
httpd虚拟主机和Nginx虚拟主机有什么区别
在虚拟机里做多站点实验,httpd和Nginx都能实现,但配置习惯不同,下面这张表可以帮助判断该选谁。
| 对比项 | httpd | Nginx |
|---|---|---|
| 配置方式 | VirtualHost、目录级配置 | server块、location块 |
| 并发模型 | 多进程/多线程 | 事件驱动 |
| 静态资源 | 稳定、生态成熟 | 高并发场景常见 |
| 动态PHP | mod_php或php-fpm | 通常配php-fpm |
| 适用场景 | 传统企业内网、教学、需要.htaccess | 高并发前端、反向代理 |
如果项目依赖.htaccess,或者团队已有Apache运维习惯,虚拟机里用httpd更顺手,如果只是做高并发静态站点实验,Nginx的server块写起来更紧凑,行业共识认为,学习虚拟主机概念时先掌握httpd的VirtualHost,再迁移到Nginx会更容易理解请求分发逻辑。
本地虚拟机搭建httpd虚拟主机需要多少钱
软件授权成本基本可以忽略:httpd本身开源免费,VirtualBox免费,VMware Workstation Player对个人使用也提供免费版本,费用通常集中在硬件、云资源或运维时间上,而不是软件本身,近年来不少开发者用旧笔记本装VirtualBox加Rocky Linux做测试,成本主要是电费和折腾时间。
如果不想本地开虚拟机,也可以买低配云服务器按需付费,但本地测试用hosts就能完成域名访问,不需要买域名和公网IP,对个人学习和小团队内网演示来说,虚拟机方案更可控。
北京企业内网Apache虚拟主机配置场景
在北京不少企业的测试环境里,IT会划一个独立VLAN,用桥接模式把虚拟机接进去,再给虚拟机固定IP或DHCP保留地址,此时配置思路和本地一致,但要多做两件事:一是把site1.com、site2.com写入内网DNS或统一维护hosts;二是确认公司防火墙策略允许80端口在测试网段内访问,若只是短期演示,直接让同事改hosts指向虚拟机IP最快,不必动DNS。
虚拟机httpd虚拟主机常见问题解答
虚拟机中httpd虚拟主机配置后浏览器访问403怎么办?
先查三处:DocumentRoot目录权限是否为755且属主为apache;VirtualHost里的<Directory>是否写了Require all granted;SELinux上下文是否被拦截,用ls -Zd /var/www/site1.com/public_html看上下文,用restorecon -Rv修正,再重启httpd。
httpd虚拟主机和基于端口虚拟主机怎么选?
多个站点共用80端口、希望用域名区分时,选基于域名,临时测试、内部工具不想改hosts时,可以用Listen 8080加端口VirtualHost,访问时写http://IP:8080,生产环境一般不建议长期使用非常规端口。
在虚拟机中用httpd搭建虚拟主机需要公网IP吗?
不需要,本地hosts或内网DNS就能完成域名访问测试;公网IP只在需要外部访问时使用,并且要同步检查防火墙、安全组和端口映射,虚拟机里的httpd虚拟主机先把80端口和内网访问跑通,再考虑对外发布。
虚拟机中用httpd搭建虚拟主机并不复杂,关键是把VirtualHost、目录权限和域名解析三件事对齐。 先在本地用hosts跑通两个站点,再迁移到内网DNS或云环境,路径最稳。