🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

Apache 虚拟主机入门:轻松管理多个域名

在上一篇文章中,我们学习了 Apache 核心配置文件 `httpd.conf` 的基本设置方法。现在,您应该能自信地发布一个属于自己的网站了。但是,如果您想“除了 `example.com` 之外,还想在同一个服务器上运行像 `example.org` 或 `blog.example.com` 这样的其他网站!”,那该怎么办呢?

答案就是我们这次要介绍的虚拟主机 (Virtual Host) 功能。利用这个功能,您可以在一台服务器(一个 IP 地址)上,像拥有多台服务器一样,按域名分别运营不同的网站。

本文将通过一个公寓房间的生动比喻,通俗易懂地解说虚拟主机的工作原理,并结合可直接复制粘贴的代码,介绍如何在您的本地环境中实际运行两个不同的域名。读完本文后,管理多个网站将不再是难事!


理解虚拟主机的工作原理

理解虚拟主机最简单的方法,就是将服务器比作一栋公寓

当访客(浏览器)来到公寓(服务器的 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` 之外的一个专用位置。

  1. 在服务器上您喜欢的位置(例如:/Users/YourName/SitesC:\Users\YourName\Sites),为每个网站创建文件夹。
    • sites/example.com/public_html
    • sites/example.org/public_html
  2. 在每个 `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` 文件的位置:

请以管理员权限打开此文件,并在文件末尾追加以下几行。

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` 的完全入门。敬请期待!

.htaccess 完全入门:重定向、URL重写与访问限制的使用方法