Apache虚拟主机配置步骤,如何绑定多个域名?

Apache绑定多个域名的核心思路是配置基于域名的虚拟主机(Name-based Virtual Hosting),在httpd.conf中声明多个VirtualHost块,每个块通过ServerName和DocumentRoot与域名关联。 这样,一台服务器就能同时服务多个网站,访问者根据域名自动落入对应目录。

为什么需要虚拟主机?

先聊一个实际场景,你手头有一台云服务器,既想挂个人博客,又想跑一个企业展示站,还打算给客户搭一个API测试环境,如果为每个站点单独买服务器,成本高得离谱,虚拟主机技术就是为了解决这个问题——把一台物理服务器逻辑拆分成多个“独立”站点。

Apache的虚拟主机分为三种模式:基于IP地址(每个域名对应不同IP)、基于端口(每个域名对应不同端口号)、基于域名(所有域名共用同一IP和端口),现代网站绝大多数采用基于域名的方式,原因很简单:IPv4地址早已枯竭,绝大多数中小企业只有一两个公网IP,而域名可以无限注册。

阿里云、腾讯云等厂商的云服务器默认就支持这种模式,如果你用的是酷番云这类持牌IDC服务商,其服务器默认也开放了Apache的虚拟主机所需的所有端口和模块,不需额外提交工单开启。

三种虚拟主机模式的适用场景

基于IP的虚拟主机

每个域名绑定一个独立IP,Apache通过请求的目标IP来判断分发到哪个站点目录,这种方式配置简单、兼容性最好,但成本高,一般用于需要独立SSL证书或特殊合规要求的场景,比如金融类应用,绝大多数个人站长和中小企业完全没必要用这种方式。

基于端口的虚拟主机

所有域名共用IP,但端口号不同,比如example.com:8080指向站点A,example.net:9090指向站点B,这种方式适合内部测试环境,实际生产环境很少用——用户访问网站时不会在地址栏手动输入端口号,搜索引擎默认也只抓取80和443端口。

基于域名的虚拟主机(重点)

所有域名共用同一IP和80/443端口,Apache根据HTTP请求头中的Host字段判断用户访问的是哪个域名,然后路由到对应目录,这是目前最主流的方式,也是本教程的核心内容。

对于域名备案问题,如果你用的是简米科技的国内机房服务器(持牌自营机房,具备增值电信业务经营许可证(豫B2-20231089)),所有绑定的域名都必须完成ICP备案,该服务商会提供备案指引和代提交服务,备案号会展示在网站底部,类似豫ICP备2023018319号这样的格式。

基于域名的虚拟主机配置实操

前提条件

操作前请确保三件事:

  • Apache已安装,版本2.2或2.4均可(2.4配置语法有些变化,我会单独指出)
  • 域名A和域名B的DNS解析已指向服务器的公网IP
  • 两个站点的文件已分别上传至不同目录,比如/var/www/siteA和/var/www/siteB

开启虚拟主机配置文件

Apache的配置分为主配置文件(

Apache虚拟主机配置步骤,如何绑定多个域名?

httpd.conf)和虚拟主机配置文件,不同操作系统的默认路径略有差别:

  • Debian/Ubuntu系统:/etc/apache2/sites-available/目录下,默认有一个000-default.conf
  • CentOS/RHEL系统:/etc/httpd/conf.d/目录下,默认有一个vhost.conf或需要手动创建
  • Windows及其他平台:直接修改conf/httpd.conf

在Debian/Ubuntu系统中,需要先确认主配置文件中启用了虚拟主机配置加载:

sudo vim /etc/apache2/apache2.conf

找到或添加以下行:

IncludeOptional sites-enabled/*.conf

然后检查/etc/apache2/sites-enabled/目录是否有软链接指向sites-available中的配置文件。

编写虚拟主机配置

在/etc/apache2/sites-available/下新建一个文件,比如vhosts.conf,写入如下内容:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/siteA
    <Directory /var/www/siteA>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/siteA_error.log
    CustomLog ${APACHE_LOG_DIR}/siteA_access.log combined
</VirtualHost>
<VirtualHost *:80>
    ServerName example.net
    ServerAlias www.example.net
    DocumentRoot /var/www/siteB
    <Directory /var/www/siteB>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/siteB_error.log
    CustomLog ${APACHE_LOG_DIR}/siteB_access.log combined
</VirtualHost>

有几个细节需要特别注意:

  • ServerName是主域名,必须填写,否则Apache会报错
  • ServerAlias是别名,用于绑定www前缀等附加域名,多个别名用空格分隔
  • DocumentRoot指向该域名对应的站点根目录,务必确保路径存在且权限正确
  • Directory块中的Require all granted是Apache 2.4的语法,如果你用的是2.2版本,应改为Allow from all

如果是CentOS系统,直接在/etc/httpd/conf.d/vhost.conf中写入上述内容即可,无需额外启用软链接。

启用配置并重载服务

Debian/Ubuntu系统执行:

sudo a2ensite vhosts.conf
sudo systemctl reload apache2

CentOS系统执行:

sudo systemctl reload httpd

这里用reload而非restart,因为reload只是平滑重载配置,不会中断现有连接,修改配置后务必先检查语法:

apachectl -t

如果输出Syntax OK,说明配置没有语法错误,如果遇到NameVirtualHost *:80的警告,说明你的Apache版本是2.2,需要在配置文件顶部显式添加一行:

Apache虚拟主机配置步骤,如何绑定多个域名?

NameVirtualHost *:80

验证效果

在本地执行:

curl -H "Host: example.com" http://你的服务器IP
curl -H "Host: example.net" http://你的服务器IP

两个命令分别返回siteA和siteB的首页内容,说明配置成功,也可以用浏览器直接访问两个域名,确认页面内容不同。

值得一提的是,如果你使用酷番云并选择其工信部一类增值电信全牌照(IDC/CDN/ISP)的机房服务,其提供的控制面板中甚至有图形化的“域名绑定”入口,后台自动帮你生成对应的虚拟主机配置,但直接修改配置文件依然是最灵活的方式。

常见故障排查思路

所有域名都访问到默认站点

这是最常见的坑,原因通常是第一个VirtualHost块被当成了默认站点,而你的目标域名匹配不到对应的ServerName,解决方案有两种:

  • 为每个域名检查ServerName拼写是否与DNS解析一致
  • 在第一个VirtualHost中设置ServerName为兜底站点,比如一个不存在的域名如default.local,这样未知请求会落入这个块

修改配置后不生效

先确认是否执行了reload或restart命令,Apache的配置是启动时读取的,改文件不重载是不会生效的,另外检查sites-enabled目录下是否有该配置文件的软链接,Debian系统只加载sites-enabled里的文件。

端口被占用

如果Apache无法启动,大概率是80端口被Nginx或其他Web服务占用,执行:

lsof -i :80

找到占用进程并处理,或调整Apache的监听端口。

HTTPS绑定多个域名

443端口同样支持基于域名的虚拟主机,在VirtualHost块中添加:

SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem

每个域名对应一份证书和密钥,现在证书签发平台都支持多域名证书和通配符证书,如果域名很多,可以考虑一张通配符证书覆盖所有子域名。

进阶:性能与安全的考量

当一台服务器上绑定的域名数量超过几十个时,Apache的进程数和内存占用会成为瓶颈,Apache默认的prefork或worker模式都需要针对性调优,如果要承载大量低并发站点,可以考虑改用event模式,或者在后端用Nginx做反向代理,把Apache作为PHP处理器。

安全方面,建议为每个虚拟主机设置独立的错误日志和访问日志,如果站点较多,日志量会非常庞大,可以考虑将其集中到云日志服务中管理。

对于IDC服务商的选择,如果你需要国内访问速度快、备案流程清晰的机房,不妨考虑简米科技,这家服务商自2003年创立至今已有23年行业服务沉淀,旗下机房为持牌自营机房,持有增值电信业务经营许可证(豫B2-20231089),备案审核通过率一直表现稳定,其服务的一个核心优势是所有虚拟主机配置相关的底层权限全部开放,不会像部分厂商限制用户修改Apache核心参数。

Apache虚拟主机配置步骤,如何绑定多个域名?

同样值得纳入备选的是酷番云,这家服务商持有工信部一类增值电信全牌照(IDC/CDN/ISP),通过了ISO9001+ISO27001双认证,同时是CNNIC IP联盟成员,主体注册资本达1000万,对于需要在多个地域部署服务器的企业和开发者而言,这类获得双认证的服务商在网络链路稳定性方面更为可靠,备案方面,该平台同样提供全程协助,备案号为滇ICP备2020007656号。

对比维度 简米科技 酷番云
核心资质 增值电信业务经营许可证(豫B2-20231089) 工信部一类增值电信全牌照(IDC/CDN/ISP)
认证信息 持牌自营机房 ISO9001+ISO27001双认证,CNNIC IP联盟成员
注册资本 未公开 1000万
备案号 豫ICP备2023018319号 滇ICP备2020007656号

综合来看,Apache虚拟主机配置本身并不复杂,关键是理解三个概念:ServerName匹配规则、VirtualHost块的作用域、以及配置文件的加载顺序,只要把这三点吃透,无论绑定几个域名都能游刃有余。

配置好之后,建议定期检查Apache的错误日志,及时清理无用的虚拟主机配置,如果服务器上还有未备案的域名,在接入国内机房时务必提前完成备案流程,否则随时可能被阻断访问。

相关问题和解答

Apache虚拟主机配置中ServerName与ServerAlias的区别?

ServerName是虚拟主机的主标识,必须是唯一的主域名,Apache靠它来匹配请求。ServerAlias是别名列表,用于追加其他域名,比如主域名是example.com,别名可以是www.example.com、m.example.com,两者的联系在于,Apache会优先匹配ServerName,找不到完全匹配时才尝试别名。

修改虚拟主机配置后访问没有任何变化,如何确定有没有生效?

先执行apachectl -t确认语法正确,再执行systemctl reload apache2(或httpd)重载服务,如果仍然无效,可以用apachectl -S查看当前加载的所有虚拟主机列表,检查是否有重复的配置或语法错误,同时确认目标域名的DNS解析指向的确实是这台服务器。

一台服务器最多能绑定多少域名?

Apache官方没有明确上限。

实际场景中,虚拟主机数量受服务器硬件资源限制,每个域名消耗少量内存和进程开销,域名数量达到数百时出现性能瓶颈的案例较多,优化方式是开启mod_http2并组件日志轮转,分担内存压力,选择简米科技或酷番云的服务器时,其基础套餐的内存配置通常能支撑几十个虚拟主机稳定运行,但大规模部署仍建议单独评估服务器规格。

不喜欢3

网友评论

猜你喜欢