在服务器管理和网站部署的实践中,单台服务器承载多个独立网站是一种常见且高效的需求,Apache HTTP 服务器,作为全球最流行的 Web 服务器软件之一,其强大的虚拟主机功能完美地满足了这一需求,本文将详细介绍如何在 Apache 2.4 环境下配置多个基于域名的虚拟主机,实现一台服务器托管多个网站的目标。
理解虚拟主机
虚拟主机允许您在一台物理服务器上运行多个网站或域名,Apache 主要支持两种类型的虚拟主机:
- 基于IP的虚拟主机:每个网站拥有一个独立的IP地址,这种方式资源消耗较大,现在已不常用,主要用于需要独立IP的特殊场景(如早期SSL证书部署)。
- 基于域名的虚拟主机:多个网站共享同一个IP地址,服务器通过客户端请求的
Host
头部信息(即域名)来区分不同的网站,这是目前最主流、最经济、最高效的配置方式,本文将重点讲解此种模式。
配置前的准备工作
在开始配置之前,请确保您的系统已经满足以下条件:
- 已安装 Apache 2.4 Web 服务器。
- 拥有服务器的 root 权限或 sudo 权限。
- 至少准备两个用于测试的域名(
site1.example.com
和site2.example.com
),如果没有真实域名,可以通过修改本地hosts
文件进行模拟测试。 - 熟悉基本的 Linux 命令和文本编辑器(如
vim
或nano
)。
配置步骤详解
我们将以配置两个网站 site1.example.com
和 site2.example.com
为例,逐步完成整个过程。
为每个网站创建目录结构
我们需要为每个网站创建独立的根目录,用于存放其网页文件,这些目录位于 /var/www/
下。
# 创建两个网站的根目录 sudo mkdir -p /var/www/site1.example.com sudo mkdir -p /var/www/site2.example.com # 为了方便管理,我们为每个目录设置正确的所有权 # www-data 是 Apache 在 Debian/Ubuntu 系统中默认运行的用户和组 sudo chown -R www-data:www-data /var/www/site1.example.com sudo chown -R www-data:www-data /var/www/site2.example.com
创建测试页面
为了在配置完成后能立即验证效果,我们为每个网站创建一个简单的 index.html
文件。
# 为 site1.example.com 创建首页 echo "<html><head><title>Site 1</title></head><body><h1>欢迎访问 site1.example.com</h1></body></html>" | sudo tee /var/www/site1.example.com/index.html # 为 site2.example.com 创建首页 echo "<html><head><title>Site 2</title></head><body><h1>欢迎访问 site2.example.com</h1></body></html>" | sudo tee /var/www/site2.example.com/index.html
创建虚拟主机配置文件
Apache 的虚拟主机配置文件通常存放在 /etc/apache2/sites-available/
目录,我们可以复制默认的配置文件作为模板,然后进行修改。
# 复制默认配置文件 sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/site1.example.com.conf sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/site2.example.com.conf
编辑虚拟主机配置文件
使用文本编辑器打开并编辑这两个新创建的配置文件。
编辑 site1.example.com.conf
:
sudo nano /etc/apache2/sites-available/site1.example.com.conf
如下:
<VirtualHost *:80> # 管理员邮箱 ServerAdmin admin@site1.example.com # 网站的主域名 ServerName site1.example.com # 网站的别名,www 子域名 ServerAlias www.site1.example.com # 网站文件的根目录 DocumentRoot /var/www/site1.example.com # 错误日志路径 ErrorLog ${APACHE_LOG_DIR}/site1.example.com_error.log # 访问日志路径 CustomLog ${APACHE_LOG_DIR}/site1.example.com_access.log combined # Apache 2.4 的访问控制配置 <Directory /var/www/site1.example.com> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
编辑 site2.example.com.conf
:
sudo nano /etc/apache2/sites-available/site2.example.com.conf
注意 ServerName
, ServerAlias
, DocumentRoot
和日志路径的变化:
<VirtualHost *:80> ServerAdmin admin@site2.example.com ServerName site2.example.com ServerAlias www.site2.example.com DocumentRoot /var/www/site2.example.com ErrorLog ${APACHE_LOG_DIR}/site2.example.com_error.log CustomLog ${APACHE_LOG_DIR}/site2.example.com_access.log combined <Directory /var/www/site2.example.com> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
关键指令说明:
指令 | 说明 |
---|---|
ServerAdmin | 设置服务器管理员的电子邮件地址,会在错误页面等信息中显示。 |
ServerName | 指定虚拟主机的主域名,这是 Apache 识别不同网站的核心依据。 |
ServerAlias | 设置域名的别名,可以设置多个,用空格隔开,常用于添加 www 前缀。 |
DocumentRoot | 指定该网站文件存放的根目录。 |
ErrorLog | 指定错误日志文件的存放路径。 |
CustomLog | 指定访问日志文件的存放路径和格式。 |
Require all granted | Apache 2.4 中用于授权访问的指令,表示允许所有客户端访问,这是与 2.2 版本的一个重要区别。 |
启用新的虚拟主机并禁用默认站点
Apache 提供了便捷的命令来管理站点的启用和禁用。
# 启用我们新创建的两个站点 sudo a2ensite site1.example.com.conf sudo a2ensite site2.example.com.conf # 禁用默认的站点,以避免冲突 sudo a2dissite 000-default.conf
a2ensite
命令实际上是在 /etc/apache2/sites-enabled/
目录中创建了一个指向 /etc/apache2/sites-available/
中对应配置文件的符号链接。
测试配置并重启 Apache
在应用更改之前,最好先检查 Apache 配置文件的语法是否正确。
sudo apache2ctl configtest
如果屏幕显示 Syntax OK
,说明配置没有语法错误,现在可以安全地重启 Apache 服务以使所有更改生效。
sudo systemctl restart apache2
验证配置结果
如果您使用的是真实域名并已正确解析到服务器的IP,现在就可以在浏览器中访问 http://site1.example.com
和 http://site2.example.com
,您应该会看到之前创建的两个不同的测试页面。
如果您是在本地或没有真实域名的情况下进行测试,可以修改您本地电脑的 hosts
文件(在 Windows 上是 C:WindowsSystem32driversetchosts
,在 Linux/macOS 上是 /etc/hosts
),添加以下两行:
<您的服务器IP地址> site1.example.com
<您的服务器IP地址> site2.example.com
保存后,在本地浏览器中访问这两个域名即可进行测试。
相关问答FAQs
问:我已经按照步骤操作,但访问两个域名都显示的是同一个网站的内容,这是为什么?
答: 这个问题通常由以下几个原因造成:
- 默认站点未禁用:请确保您已经执行了
sudo a2dissite 000-default.conf
命令,并重启了 Apache,如果默认站点仍然启用,它可能会作为“捕获所有”的站点,匹配所有未被明确配置的请求。 :请仔细检查两个 .conf
文件中的ServerName
指令是否正确无误,且互不相同。:确认您访问的域名确实指向了正确的服务器IP地址,可以尝试在服务器上使用 ping
命令检查域名解析。- Apache 未重启:配置文件修改后,必须重启 Apache 服务才能加载新的配置,请确保执行了
sudo systemctl restart apache2
。
问:基于域名的虚拟主机和基于IP的虚拟主机在实际应用中该如何选择?
答: 绝大多数情况下,基于域名的虚拟主机是首选,它的最大优势是经济高效,多个网站可以共享同一个IP地址,这对于IPv4地址日益紧张的今天尤为重要,只要您的网站不需要特殊的网络隔离或独立的SSL证书(现代的SNI技术已允许在共享IP上部署多个SSL证书),基于域名的方式都能完美满足需求。
基于IP的虚拟主机主要用于以下特定场景:
- 需要特殊SSL证书:一些非常老旧的系统或设备不支持SNI(Server Name Indication),需要为每个SSL证书绑定独立的IP。
- 网络隔离与安全:需要为不同网站配置不同的防火墙规则或网络策略。
- 运行在不同端口:虽然基于域名的也可以指定端口,但基于IP的配置在逻辑上更清晰,
168.1.10:80
和168.1.11:8080
。
除非有明确的技术或业务需求,否则优先选择基于域名的虚拟主机配置。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复