Apache HTTP Server作为全球最流行的Web服务器软件之一,其强大的模块化设计使得在同一服务器实例上托管多个网站变得轻而易举,实现Apache配置多个域名访问的核心技术在于基于名称的虚拟主机,通过这种配置,管理员无需为每个域名分配独立的IP地址,仅需一个公网IP即可根据HTTP请求头中的Host信息,将不同的流量精准分发至对应的网站根目录,这不仅极大地节省了宝贵的IP资源,还显著降低了服务器运维成本,是构建高效多站点环境的标准解决方案。

前置准备与DNS解析
在深入Apache配置之前,必须确保域名解析环节的正确性,无论使用的是阿里云、腾讯云还是其他DNS服务商,都需要将所有需要指向该服务器的域名(例如www.example.com和www.test.com)的A记录,全部解析到服务器的同一公网IP地址,DNS解析是互联网访问的基石,如果这一步配置错误,Apache服务端即便配置得再完美,用户也无法通过域名访问到网站,建议在服务器文件系统中为每个域名创建独立的目录,例如/var/www/html/site1和/var/www/html/site2,并赋予Web服务器用户(通常是www-data或daemon)相应的读取权限,以避免后续出现403 Forbidden错误。
核心配置指令解析
Apache的虚拟主机配置主要依赖于<VirtualHost>容器块,理解该容器内的核心指令是掌握多域名配置的关键。
ServerName指令,这是虚拟主机的唯一标识,用于指定域名,Apache会优先将请求中的Host字段与ServerName进行匹配,其次是ServerAlias,该指令用于设置域名的别名,例如在配置主域名www.example.com时,可以通过ServerAlias添加example.com,从而实现带www和不带www的域名都能访问同一个站点,最后是DocumentRoot指令,它定义了该域名对应的网站根目录在服务器文件系统中的绝对路径,所有对该域名的请求最终都会映射到该目录下的文件。
实战配置方案与代码示例
为了保持配置文件的清晰与可维护性,建议采用独立配置文件的方式,在基于Debian或Ubuntu的系统(如Ubuntu 20.04/22.04)中,通常在/etc/apache2/sites-available/目录下创建配置文件,然后通过a2ensite命令启用;而在基于CentOS或RedHat的系统(如CentOS 7/8/9)中,通常直接在/etc/httpd/conf.d/目录下创建.conf结尾的配置文件即可自动加载。
以下是一个标准的双域名配置示例:

# 配置第一个域名:www.example.com
<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/html/site1
# 目录权限设置,确保安全访问
<Directory /var/www/html/site1>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/site1_error.log
CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
</VirtualHost>
# 配置第二个域名:www.test.com
<VirtualHost *:80>
ServerAdmin admin@test.com
ServerName www.test.com
ServerAlias test.com
DocumentRoot /var/www/html/site2
<Directory /var/www/html/site2>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/site2_error.log
CustomLog ${APACHE_LOG_DIR}/site2_access.log combined
</VirtualHost>
在上述配置中,<VirtualHost *:80>表示监听所有IP地址的80端口。AllowOverride All指令允许目录下的.htaccess文件覆盖配置,这对于WordPress等CMS程序至关重要。务必注意,配置完成后必须使用apachectl configtest或httpd -t命令检查配置文件语法是否正确,确认输出Syntax OK后,再执行systemctl restart apache2或systemctl restart httpd重启服务使配置生效。
HTTPS安全与SSL证书集成
在现代网络环境中,HTTPS已成为标配,为每个域名配置SSL证书不仅能提升网站安全性,更是搜索引擎排名的重要因素,配置HTTPS虚拟主机时,需要将监听端口改为443,并在虚拟主机块内添加SSL相关指令。
<VirtualHost *:443>
ServerName www.example.com
DocumentRoot /var/www/html/site1
SSLEngine on
SSLCertificateFile /path/to/your_domain_name.crt
SSLCertificateKeyFile /path/to/your_private_key.key
SSLCertificateChainFile /path/to/DigiCertCA.crt
<Directory /var/www/html/site1>
Require all granted
</Directory>
</VirtualHost>
# HTTP自动跳转HTTPS
<VirtualHost *:80>
ServerName www.example.com
Redirect permanent / https://www.example.com/
</VirtualHost>
通过上述配置,Apache会强制将用户的HTTP请求重定向至HTTPS,为了简化管理,建议使用Let’s Encrypt等免费证书自动化工具,如Certbot,它可以自动修改Apache配置文件并部署证书,极大地降低了运维复杂度。
日志分离与性能优化
在多域名环境下,日志分离是专业运维的体现,通过为每个虚拟主机设置独立的ErrorLog和CustomLog,管理员可以快速定位特定网站的故障或进行独立的流量分析,避免所有网站的日志混杂在一起难以梳理,为了提升性能,可以结合mod_deflate模块启用Gzip压缩,或者配置mod_expires模块设置静态资源缓存,这些全局配置通常在主配置文件中设置,但对所有虚拟主机生效,有助于提升SEO评分中的“页面加载速度”指标。
相关问答模块
Q1:配置完成后,访问所有域名都显示同一个网站的内容,这是为什么?
A1:这通常是因为Apache没有找到匹配的虚拟主机,因此默认使用了配置文件中的第一个虚拟主机作为默认站点,请检查ServerName是否拼写正确,并确保DNS解析的域名与配置文件中的ServerName完全一致,确认没有使用_default_标记覆盖了特定配置。

Q2:如何配置Apache实现泛域名解析,例如将所有子域名指向同一个目录?
A2:可以使用通配符符在ServerName或ServerAlias中实现,例如配置ServerName *.example.com,或者在VirtualDocumentRoot指令中使用变量,如果需要将a.example.com和b.example.com分别映射到/var/www/html/a和/var/www/html/b,可以使用mod_vhost_alias模块,配置VirtualDocumentRoot /var/www/html/%0,其中%0代表完整的域名。
如果您在配置Apache多域名过程中遇到权限拒绝或端口冲突等问题,欢迎在下方留言,我们将为您提供进一步的排查思路。


















