Apache 虚拟主机入门:轻松管理多个域名
在上一篇文章中,我们学习了 Apache 核心配置文件 `httpd.conf` 的基本设置方法。现在,您应该能自信地发布一个属于自己的网站了。但是,如果您想“除了 `example.com` 之外,还想在同一个服务器上运行像 `example.org` 或 `blog.example.com` 这样的其他网站!”,那该怎么办呢?
答案就是我们这次要介绍的虚拟主机 (Virtual Host) 功能。利用这个功能,您可以在一台服务器(一个 IP 地址)上,像拥有多台服务器一样,按域名分别运营不同的网站。
本文将通过一个公寓房间的生动比喻,通俗易懂地解说虚拟主机的工作原理,并结合可直接复制粘贴的代码,介绍如何在您的本地环境中实际运行两个不同的域名。读完本文后,管理多个网站将不再是难事!
理解虚拟主机的工作原理
理解虚拟主机最简单的方法,就是将服务器比作一栋公寓。
- 服务器 (IP 地址): 整栋公寓楼(地址只有一个)
- 各个网站: 公寓里的每个房间(101室、102室...)
- 域名: 每个房间门口的门牌(“张先生”、“李女士”)
当访客(浏览器)来到公寓(服务器的 IP 地址)时,如果说“我来找张先生 (`example.com`)”,公寓的物业(Apache)就会把访客引导到张先生的房间(`example.com` 的网站)。如果说“我来找李女士 (`example.org`)”,就会被引导到李女士的房间。
这种通过查看“门牌”(域名)来切换引导目的地的机制,就是基于名称的虚拟主机。这是目前最普遍的方法,本文也将采用这种方式进行设置。
步骤 1: 虚拟主机设置的准备工作
在实际编写配置文件之前,需要做一些准备工作。
1-1. 启用虚拟主机配置文件
在 Apache 中,为了保持主配置文件 `httpd.conf` 的整洁,推荐将虚拟主机的设置写在另一个独立的文件里。首先,请打开 `httpd.conf` 文件,找到以下这行。如果行首有 `#`(表示该行是注释),请删除 `#` 来启用它。
# 在 httpd.conf 文件中,取消本行的注释(删除 #)
Include conf/extra/httpd-vhosts.conf
这一行会让 Apache 读取 `conf/extra/httpd-vhosts.conf` 文件,并应用其中编写的虚拟主机设置。
1-2. 创建各网站的目录和文件
接下来,我们为 `example.com` 和 `example.org` 这两个网站创建文件夹,以及它们各自的首页 HTML 文件。这里,为了便于集中管理网站数据,我们将示例文件夹创建在 `htdocs` 之外的一个专用位置。
- 在服务器上您喜欢的位置(例如:
/Users/YourName/Sites或C:\Users\YourName\Sites),为每个网站创建文件夹。sites/example.com/public_htmlsites/example.org/public_html
- 在每个 `public_html` 文件夹中,创建一个简单的 `index.html` 文件,以便能区分当前显示的是哪个网站。
`sites/example.com/public_html/index.html` 的内容:
<!DOCTYPE html>
<html>
<head><title>欢迎!</title></head>
<body><h1>这里是 example.com 的页面</h1></body>
</html>
`sites/example.org/public_html/index.html` 的内容:
<!DOCTYPE html>
<html>
<head><title>欢迎!</title></head>
<body><h1>这里是 example.org 的页面</h1></body>
</html>
步骤 2: 配置虚拟主机 (httpd-vhosts.conf)
准备工作就绪后,就该编辑 `conf/extra/httpd-vhosts.conf` 文件了。我们将在这个文件中写入每个网站的“房间信息”。
首先是 `example.com` 的配置。将以下代码块追加到 `httpd-vhosts.conf` 文件中。(您可以删除或用 `#` 注释掉文件中原有的示例内容)。
<VirtualHost *:80>
# 此虚拟主机的主域名
ServerName example.com
# 也可以指定别名,例如带 www 的域名
ServerAlias www.example.com
# 此网站文件的存放位置(刚才创建的文件夹路径)
DocumentRoot "/Users/YourName/Sites/example.com/public_html"
# 此网站专用的错误日志
ErrorLog "/Users/YourName/Sites/example.com/error_log"
# 此网站专用的访问日志
CustomLog "/Users/YourName/Sites/example.com/access_log" common
# 目录的访问权限设置
<Directory "/Users/YourName/Sites/example.com/public_html">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
※ 请根据您自己的环境,修改 `DocumentRoot` 等路径。
接着,我们追加 `example.org` 的配置。在刚才的配置块下面,以同样的方式写入。
<VirtualHost *:80>
ServerName example.org
DocumentRoot "/Users/YourName/Sites/example.org/public_html"
ErrorLog "/Users/YourName/Sites/example.org/error_log"
CustomLog "/Users/YourName/Sites/example.org/access_log" common
<Directory "/Users/YourName/Sites/example.org/public_html">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
步骤 3: 在本地环境中进行测试 (hosts 文件)
好了,Apache 的配置已经完成,但现在直接访问 `example.com` 并不会连接到您的电脑。为了在本地环境中测试,我们需要编辑您电脑上的 `hosts` 文件,强制将 `example.com` 这个域名指向您的电脑(即 `127.0.0.1`)。
`hosts` 文件的位置:
- Windows:
C:\Windows\System32\drivers\etc\hosts - macOS / Linux:
/etc/hosts
请以管理员权限打开此文件,并在文件末尾追加以下几行。
127.0.0.1 example.com
127.0.0.1 www.example.com
127.0.0.1 example.org
步骤 4: 重启并验证 Apache
所有设置都完成了!最后,我们来检查一下 Apache 的配置是否有误(语法检查),如果没问题就重启服务器。
# 语法检查 (如果没有错误输出就表示 OK)
httpd -t
# 重启 Apache (Windows)
httpd.exe -k restart
# 重启 Apache (macOS Homebrew)
brew services restart httpd
# 重启 Apache (Linux)
sudo systemctl restart apache2 # 或 httpd
重启后,请在浏览器中分别访问 `http://example.com` 和 `http://example.org`。如果能看到“这里是 example.com 的页面”和“这里是 example.org 的页面”这样不同的内容,就大功告成了!
应用示例:运营子域名
虚拟主机也可以用于运营子域名(例如:`blog.example.com`)。设置方法和之前完全一样,只需在 `httpd-vhosts.conf` 文件中追加一个新的 `<VirtualHost>` 块。
<VirtualHost *:80>
ServerName blog.example.com
DocumentRoot "/Users/YourName/Sites/blog.example.com/public_html"
# ... 日志和 Directory 的设置也同样地写入 ...
</VirtualHost>
当然,之后别忘了在 `hosts` 文件中追加 `127.0.0.1 blog.example.com` 并重启 Apache 哦。
总结
辛苦了!这次,我们学习了 Apache 的虚拟主机功能,从其工作原理到具体设置方法,了解了如何在一台服务器上管理多个域名。通过公寓的例子,您是不是对服务器和域名之间的关系有了更形象的理解呢?
掌握了虚拟主机之后,您就可以高效地管理多个不同用途的项目,例如个人兴趣网站、作品集网站、正在开发的客户项目等。您的服务器管理技能又提升了一个档次!
好了,既然已经学会了如何为服务器“分配房间”,接下来是不是想学习如何为每个房间进行更精细的“装修”和“规则”设定呢?我们下一次的主题,就是那个能实现按目录进行各种控制的魔法文件——`.htaccess` 的完全入门。敬请期待!