Apache配置不同域名的基础概念
在Apache服务器中,不同域名的配置核心在于基于名称的虚拟主机(Name-Based Virtual Host),通过这种机制,单个服务器可以根据请求的域名(Host头)将流量导向不同的网站目录或配置,与基于IP的虚拟主机不同,基于名称的虚拟主机无需为每个域名分配独立IP地址,极大地节省了服务器资源,是现代网站部署的主流方式。

Apache的虚拟主机配置主要依赖于httpd.conf主配置文件或独立的虚拟主机配置文件(如sites-available目录下的文件),配置时需确保模块已启用,并通过<VirtualHost>指令定义不同域名的参数,包括监听的端口、网站根目录、日志路径等。
虚拟主机配置的准备工作
在开始配置不同域名前,需完成以下准备工作:
- 域名解析:确保每个域名已正确解析到服务器的公网IP地址(或内网IP,若为内网部署),可通过
ping命令验证域名是否指向目标IP。 - Apache模块启用:检查并启用
mod_vhost_alias和mod_rewrite(若涉及URL重写)等模块,使用a2enmod vhost_alias命令启用模块后,需重启Apache服务使配置生效。 - 目录权限:为每个域名创建独立的网站根目录,并设置正确的文件所有者及权限(如
www-data:www-data),确保Apache进程可读写文件。
基于名称的虚拟主机配置步骤
定义默认虚拟主机
在配置具体域名前,建议先设置一个默认虚拟主机,用于处理未匹配域名的请求(如直接通过IP访问的流量),示例配置如下:
<VirtualHost *:80>
ServerAdmin webmaster@default.com
DocumentRoot "/var/www/default"
ErrorLog "${APACHE_LOG_DIR}/default_error.log"
CustomLog "${APACHE_LOG_DIR}/default_access.log" combined
</VirtualHost>
配置具体域名的虚拟主机
假设需要配置两个域名:example.com和test.com,分别指向不同的网站目录,在/etc/apache2/sites-available/目录下创建配置文件(如example.com.conf如下:

<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com # 包含带www的子域名
DocumentRoot "/var/www/example.com"
<Directory "/var/www/example.com">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog "${APACHE_LOG_DIR}/example.com_error.log"
CustomLog "${APACHE_LOG_DIR}/example.com_access.log" combined
</VirtualHost>
<VirtualHost *:80>
ServerName test.com
ServerAlias www.test.com
DocumentRoot "/var/www/test.com"
<Directory "/var/www/test.com">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog "${APACHE_LOG_DIR}/test.com_error.log"
CustomLog "${APACHE_LOG_DIR}/test.com_access.log" combined
</VirtualHost>
启用配置并重启服务
使用a2ensite example.com.conf命令启用配置文件,然后执行systemctl restart apache2重启服务,若配置无误,访问example.com和test.com将分别显示对应目录下的网站内容。
多端口与HTTPS配置
监听多端口
若需通过不同端口访问不同域名(如8080端口对应test.com),可在<VirtualHost>指令中指定端口:
<VirtualHost *:8080>
ServerName test.com
DocumentRoot "/var/www/test.com"
# 其他配置...
</VirtualHost>
HTTPS配置
为启用HTTPS,需为每个域名申请SSL证书(如Let’s Encrypt免费证书),并在虚拟主机中添加443端口配置:
<VirtualHost *:443>
ServerName example.com
DocumentRoot "/var/www/example.com"
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# 其他配置...
</VirtualHost>
需在HTTP虚拟主机中添加301重定向,将HTTP请求强制跳转至HTTPS:

<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
常见问题与解决方案
域名访问显示默认页面
- 原因:DNS解析未生效或虚拟主机配置错误。
- 解决:使用
nslookup检查域名解析是否正确;确认ServerName与ServerAlias是否包含所有需要绑定的域名。
权限错误导致403 Forbidden
- 原因:网站目录权限不足或
<Directory>配置不当。 - 解决:检查目录所有者是否为Apache运行用户(如
www-data),确保Require all granted或AllowOverride正确设置。
配置语法错误
- 原因:虚拟主机配置文件存在语法问题。
- 解决:使用
apache2ctl configtest命令检查语法错误,根据提示修正配置后重启服务。
高级配置技巧
基于目录的虚拟主机
若需在同一域名下通过不同目录访问不同网站,可使用mod_rewrite实现URL重写,将example.com/site1指向/var/www/site1目录:
<VirtualHost *:80>
ServerName example.com
DocumentRoot "/var/www/example.com"
RewriteEngine on
RewriteRule ^/site1(.*) /var/www/site1$1 [L]
</VirtualHost>
日志分离与统计
为每个虚拟主机设置独立的日志文件,便于单独分析访问量,可结合awstats或goaccess等工具对日志进行统计,生成可视化报表。
Apache通过基于名称的虚拟主机功能,实现了多域名的灵活配置与管理,从基础的域名解析到HTTPS加密、多端口支持,再到高级的URL重写和日志统计,合理的虚拟主机配置不仅能提升服务器资源利用率,还能为不同网站提供独立、安全的服务环境,在实际操作中,需注意权限设置、语法检查及错误排查,确保多域名环境稳定运行。

















