如何在Ubuntu16.04上设置Apache虚拟主机

来自菜鸟教程
跳转至:导航、​搜索

介绍

Apache Web 服务器是在 Internet 上提供 Web 内容的最流行的方式。 它占互联网上所有活跃网站的一半以上,并且非常强大和灵活。

Apache 将其功能和组件分解为可以独立定制和配置的独立单元。 描述单个站点或域的基本单元称为 virtual host

这些指定允许管理员通过使用匹配机制,使用一台服务器在单个接口或 IP 之外托管多个域或站点。 这与希望在一台服务器上托管多个站点的任何人有关。

配置的每个域都会将访问者引导到保存该站点信息的特定目录,从不表示同一服务器还负责其他站点。 只要您的服务器可以处理负载,此方案就可以扩展,没有任何软件限制。

在本指南中,我们将引导您了解如何在 Ubuntu 16.04 服务器上设置 Apache 虚拟主机。 在此过程中,您将学习如何根据不同的访问者请求的域向不同的访问者提供不同的内容。

先决条件

在开始本教程之前,您应该 创建一个启用 sudo 的非 root 用户 ,如此处步骤 1-4 中所述。

您还需要安装 Apache 才能完成这些步骤。 如果您还没有这样做,您可以通过 apt-get 在您的服务器上安装 Apache:

sudo apt-get update
sudo apt-get install apache2

完成这些步骤后,我们就可以开始了。

出于本指南的目的,我们的配置将为 example.com 创建一个虚拟主机,为 test.com 创建一个虚拟主机。 这些将在整个指南中被引用,但您应该在跟随时替换您自己的域或值。

如果您使用虚拟值,我们稍后将展示如何编辑本地主机文件以测试配置。 这将允许您从家用计算机测试您的配置,即使您的内容无法通过域名提供给其他访问者。

第 1 步 - 创建目录结构

我们要采取的第一步是创建一个目录结构来保存我们将提供给访问者的站点数据。

我们的 document root(Apache 查找要提供的内容的顶级目录)将设置为 /var/www 目录下的各个目录。 我们将在这里为我们计划制作的两个虚拟主机创建一个目录。

在每个 这些 目录中,我们将创建一个 public_html 文件夹来保存我们的实际文件。 这为我们的托管提供了一些灵活性。

例如,对于我们的网站,我们将创建这样的目录:

sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/test.com/public_html

红色部分代表我们希望从我们的 VPS 服务的域名。

第 2 步 — 授予权限

现在我们有了文件的目录结构,但它们归我们的 root 用户所有。 如果我们希望我们的普通用户能够修改我们的 web 目录中的文件,我们可以通过这样做来更改所有权:

sudo chown -R $USER:$USER /var/www/example.com/public_html
sudo chown -R $USER:$USER /var/www/test.com/public_html

$USER 变量将采用您当前登录的用户的值,就像您按下 ENTER 时一样。 通过这样做,我们的普通用户现在拥有 public_html 子目录,我们将在其中存储我们的内容。

我们还应该稍微修改一下我们的权限,以确保允许对一般 Web 目录及其包含的所有文件和文件夹进行读取访问,以便可以正确提供页面:

sudo chmod -R 755 /var/www

您的 Web 服务器现在应该具有提供内容所需的权限,并且您的用户应该能够在必要的文件夹中创建内容。

第 3 步 — 为每个虚拟主机创建演示页面

我们有我们的目录结构。 让我们创建一些内容来提供服务。

我们只是进行演示,所以我们的页面将非常简单。 我们将为每个站点创建一个 index.html 页面。

让我们从 example.com 开始。 我们可以在编辑器中打开一个 index.html 文件,输入:

nano /var/www/example.com/public_html/index.html

在这个文件中,创建一个简单的 HTML 文档来指示它所连接的站点。 该文件如下所示:

/var/www/example.com/public_html/index.html

<html>
  <head>
    <title>Welcome to Example.com!</title>
  </head>
  <body>
    <h1>Success!  The example.com virtual host is working!</h1>
  </body>
</html>

完成后保存并关闭文件。

我们可以通过键入以下内容复制此文件以用作我们第二个站点的基础:

cp /var/www/example.com/public_html/index.html /var/www/test.com/public_html/index.html

然后我们可以打开文件并修改相关信息:

nano /var/www/test.com/public_html/index.html

/var/www/test.com/public_html/index.html

<html>
  <head>
    <title>Welcome to Test.com!</title>
  </head>
  <body> <h1>Success!  The test.com virtual host is working!</h1>
  </body>
</html>

保存并关闭此文件。 您现在拥有测试虚拟主机配置所需的页面。

第 4 步 — 创建新的虚拟主机文件

虚拟主机文件是指定我们虚拟主机的实际配置并指示 Apache Web 服务器如何响应各种域请求的文件。

Apache 附带一个名为 000-default.conf 的默认虚拟主机文件,我们可以将其用作起点。 我们将把它复制过来,为我们的每个域创建一个虚拟主机文件。

我们将从一个域开始,对其进行配置,将其复制到我们的第二个域中,然后进行一些必要的进一步调整。 默认的 Ubuntu 配置要求每个虚拟主机文件以 .conf 结尾。

创建第一个虚拟主机文件

首先复制第一个域的文件:

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf

使用 root 权限在编辑器中打开新文件:

sudo nano /etc/apache2/sites-available/example.com.conf

该文件将如下所示(此处已删除注释以使该文件更易于访问):

/etc/apache2/sites-available/example.com.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

如您所见,这里没有太多内容。 我们将在此处为我们的第一个域自定义项目并添加一些额外的指令。 此虚拟主机部分匹配在端口 80(默认 HTTP 端口)上发出的 any 请求。

首先,我们需要将 ServerAdmin 指令更改为站点管理员可以通过其接收电子邮件的电子邮件。

ServerAdmin admin@example.com

在此之后,我们需要 add 两个指令。 第一个称为 ServerName,建立应该与此虚拟主机定义匹配的基本域。 这很可能是您的域。 第二个,称为 ServerAlias,定义了应该匹配的其他名称,就好像它们是基本名称一样。 这对于匹配您定义的主机很有用,例如 www

ServerName example.com
ServerAlias www.example.com

对于基本虚拟主机文件,我们唯一需要更改的另一件事是该域的文档根目录的位置。 我们已经创建了我们需要的目录,所以我们只需要更改 DocumentRoot 指令以反映我们创建的目录:

DocumentRoot /var/www/example.com/public_html

总的来说,我们的虚拟主机文件应该是这样的:

/etc/apache2/sites-available/example.com.conf

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

保存并关闭文件。

复制第一个虚拟主机并自定义第二个域

现在我们已经建立了第一个虚拟主机文件,我们可以通过复制该文件并根据需要对其进行调整来创建第二个。

从复制它开始:

sudo cp /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-available/test.com.conf

在编辑器中以 root 权限打开新文件:

sudo nano /etc/apache2/sites-available/test.com.conf

您现在需要修改所有信息以引用您的第二个域。 完成后,它可能看起来像这样:

/etc/apache2/sites-available/test.com.conf

<VirtualHost *:80>
    ServerAdmin admin@test.com
    ServerName test.com
    ServerAlias www.test.com
    DocumentRoot /var/www/test.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

完成后保存并关闭文件。

第 5 步 — 启用新的虚拟主机文件

现在我们已经创建了虚拟主机文件,我们必须启用它们。 Apache 包含一些允许我们执行此操作的工具。

我们可以使用 a2ensite 工具来启用我们的每个站点,如下所示:

sudo a2ensite example.com.conf
sudo a2ensite test.com.conf

接下来,禁用 000-default.conf 中定义的默认站点:

sudo a2dissite 000-default.conf

完成后,您需要重新启动 Apache 以使这些更改生效:

sudo systemctl restart apache2

第 6 步 — 设置本地主机文件(可选)

如果您没有使用您拥有的实际域名来测试此过程,而是使用了一些示例域,您至少可以通过临时修改本地上的 hosts 文件来测试此过程的功能电脑。

这将拦截对您配置的域的任何请求并将它们指向您的服务器,就像 DNS 系统在您使用注册域时所做的那样。 不过,这仅适用于您的计算机,并且仅用于测试目的。

确保您在本地计算机上操作这些步骤,而不是在您的服务器上。 您将需要知道计算机的管理密码或以其他方式成为管理组的成员。

如果您使用的是 Mac 或 Linux 计算机,请使用管理员权限编辑本地文件,方法是键入:

sudo nano /etc/hosts

如果您使用的是 Windows 机器,您可以 在此处找到更改主机文件的说明

您需要添加的详细信息是您的 VPS 服务器的公共 IP 地址,后跟您要用于访问该 VPS 的域。

对于我在本指南中使用的域,假设我的 VPS IP 地址是 203.0.113.10,我可以将以下行添加到主机文件的底部:

/etc/hosts

127.0.0.1   localhost
127.0.1.1   guest-desktop
203.0.113.10 example.com
203.0.113.10 test.com

这将引导我们计算机上对 example.comtest.com 的任何请求,并将它们发送到我们的服务器 203.0.113.10。 如果我们实际上不是这些域的所有者来测试我们的虚拟主机,这就是我们想要的。

保存并关闭文件。

第 7 步——测试你的结果

现在您已经配置了虚拟主机,您可以通过转到您在 Web 浏览器中配置的域来轻松测试您的设置:

http://example.com

您应该会看到如下所示的页面:

同样,如果您可以访问第二页:

http://test.com

您将看到为第二个站点创建的文件:

如果这两个站点都运行良好,那么您已经成功地在同一台服务器上配置了 two 虚拟主机。

如果您调整了家用计算机的 hosts 文件,您可能想要删除添加的行,因为您已经验证了您的配置有效。 这将防止您的主机文件被实际不需要的条目填充。

如果您需要长期访问,请考虑为您需要的每个站点购买一个域名,然后 将其设置为指向您的 VPS 服务器

结论

如果您继续,您现在应该有一个服务器处理两个单独的域名。 您可以按照我们上面概述的步骤来扩展此过程以创建其他虚拟主机。

Apache 可以处理的域名数量没有软件限制,所以您可以随意制作尽可能多的服务器能够处理的域名。