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

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

介绍

Apache HTTP 服务器是一种流行的开源 Web 服务器,它为开发人员提供了灵活性、强大的功能和广泛的支持。 Apache 服务器配置不是在单个单一文件中进行,而是通过模块化设计进行,可以根据需要添加和修改新文件。 在这种模块化设计中,您可以创建一个单独的站点或域,称为 虚拟主机

使用虚拟主机,一个 Apache 实例可以为多个网站提供服务。 使用 Apache 配置的每个域或单个站点都会将访问者引导到包含该站点信息的特定目录。 这是在没有向访问者表明同一服务器也负责其他站点的情况下完成的。 只要您的服务器可以处理负载,此方案就可以扩展,没有任何软件限制。

在本指南中,您将在 Ubuntu 20.04 服务器上设置 Apache 虚拟主机。 在此过程中,您将学习如何通过创建两个虚拟主机站点,根据他们请求的域为不同的访问者提供不同的内容。

先决条件

在开始本教程之前,您需要:

  • 具有 sudo 权限的非 root 用户的 Ubuntu 20.04 服务器。 您可以使用我们的 Initial Server Setup with Ubuntu 20.04 指南进行设置。
  • Apache 安装在服务器上。 您可以通过完成我们的 如何在 Ubuntu 20.04 教程上安装 Apache Web 服务器的步骤 1-3 来了解如何操作。

如果您使用的是 DigitalOcean,您可以按照我们的产品文档 如何添加域 来学习如何设置域。

为了成功完成本教程,您需要两个域:

  • 带有 your_domain 的 A 记录指向您服务器的公共 IP 地址。
  • 带有 www.your_domain 的 A 记录指向您服务器的公共 IP 地址。

对于其他供应商,请参阅他们的相关产品文档。


注意: 如果您 not 目前没有可用的域,您可以在计算机上本地使用测试值。 本教程的第 6 步将向您展示如何测试和配置您的测试值。 这将允许您验证您的配置,即使您的内容将无法通过域名提供给其他访问者。


第 1 步 - 创建目录结构

第一步是创建一个目录结构,用于保存您将提供给访问者的站点数据。

您的 文档根 是 Apache 查找要提供的内容的顶级目录,将设置为 /var/www 目录下的各个目录。 您将在此处为每个虚拟主机创建一个目录。

在每个目录中,您将创建一个 public_html 目录。 public_html 目录包含将提供给访问者的内容。 父目录(此处命名为 your_domain_1your_domain_2)将保存脚本和应用程序代码以支持 Web 内容。

使用这些命令和您自己的域名来创建您的目录:

sudo mkdir -p /var/www/your_domain_1/public_html
sudo mkdir -p /var/www/your_domain_2/public_html

请务必将 your_domain_1your_domain_2 替换为您自己的相应域。 例如,如果您的域之一是 example.com,您将创建以下目录结构:/var/www/example.com/public_html

第 2 步 — 授予权限

您已经为您的文件创建了目录结构,但它们归 root 用户所有。 如果您希望您的普通用户能够修改这些 Web 目录中的文件,您可以使用以下命令更改所有权:

sudo chown -R $USER:$USER /var/www/your_domain_1/public_html
sudo chown -R $USER:$USER /var/www/your_domain_2/public_html

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

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

sudo chmod -R 755 /var/www

您的 Web 服务器现在具有提供内容所需的权限,并且您的用户应该能够在必要的文件夹中创建内容。 下一步是为您的虚拟主机站点创建内容。

第 3 步 — 为每个虚拟主机创建默认页面

有了目录结构,您就可以开始关注每个单独的虚拟主机站点以及该站点中的内容。 首先为您的第一个站点 your_domain_1 创建一个 index.html 页面。

使用您喜欢的文本编辑器打开并创建 index.html 文件。 此示例使用 nano

nano /var/www/your_domain_1/public_html/index.html

在此文件中,创建一个 HTML 文件,向访问者指示他们连接到的站点:

/var/www/your_domain_1/public_html/index.html

<html>
  <head>
    <title>Welcome to your_domain_1!</title>
  </head>
  <body>
    <h1>Success! The your_domain_1 virtual host is working!</h1>
  </body>
</html>

要保存并关闭 nano 中的文件,请先按 CTRL+X。 提示保存文件时按Y,完成后按ENTER退出。

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

cp /var/www/your_domain_1/public_html/index.html /var/www/your_domain_2/public_html/index.html

然后像以前一样使用文本编辑器打开这个新文件并修改相关信息:

nano /var/www/your_domain_2/public_html/index.html

/var/www/your_domain_2/public_html/index.html

<html>
  <head>
    <title>Welcome to your_domain_2!</title>
  </head>
  <body> <h1>Success! The your_domain_2 virtual host is working!</h1>
  </body>
</html>

保存并关闭此文件。 现在,每个站点都有一个页面,可用于测试虚拟主机配置。

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

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

Apache 带有一个名为 000-default.conf 的默认虚拟主机文件。 您可以复制此文件以为您的每个域创建虚拟主机文件。

将默认配置文件复制到第一个域:

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

请注意,默认的 Ubuntu 配置要求每个虚拟主机文件以 .conf 结尾。

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

sudo nano /etc/apache2/sites-available/your_domain_1.conf

删除注释后,文件将类似于:

/etc/apache2/sites-available/your_domain_1.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 端口)上发出的任何请求。

首先,将 ServerAdmin 指令更改为站点管理员可以通过以下方式接收电子邮件的电子邮件:

/etc/apache2/sites-available/your_domain_1.conf

ServerAdmin admin@your_domain_1

在此之后,添加两个附加指令。 第一个称为 ServerName,为虚拟主机定义建立基本域。 第二个,称为 ServerAlias,定义了应该匹配的其他名称,就好像它们是基本名称一样。 这对于匹配您定义的其他主机很有用。 例如,如果您将 ServerName 指令设置为 example.com,您可以将 ServerAlias 定义为 www.example.com,两者都将指向该服务器的 IP 地址。

ServerAdmin 行之后将这两个指令添加到配置文件中:

/etc/apache2/sites-available/your_domain_1.conf

<VirtualHost *:80>
  ...
    ServerAdmin admin@your_domain_1
    ServerName your_domain_1
    ServerAlias www.your_domain_1
    DocumentRoot /var/www/html
    ...
</VirtualHost>

接下来,更改此域的文档根目录的虚拟主机文件位置。 编辑 DocumentRoot 指令以指向您为此主机创建的目录:

/etc/apache2/sites-available/your_domain_1.conf

DocumentRoot /var/www/your_domain_1/public_html

这是一个虚拟主机文件的例子,上面做了所有的调整:

/etc/apache2/sites-available/your_domain_1.conf

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

保存并关闭文件。

通过从第一个虚拟主机站点复制文件来创建第二个配置文件:

sudo cp /etc/apache2/sites-available/your_domain_1.conf /etc/apache2/sites-available/your_domain_2.conf

在您喜欢的编辑器中打开新文件:

sudo nano /etc/apache2/sites-available/your_domain_2.conf

您现在需要修改所有信息以引用您的第二个域。 完成后,它应该如下所示:

/etc/apache2/sites-available/your_domain_2.conf

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

完成后保存并关闭文件。

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

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

您将使用 a2ensite 工具来启用您的每个站点。 如果你想了解更多关于这个脚本的信息,你可以参考a2ensite 文档

使用以下命令启用您的虚拟主机站点:

sudo a2ensite your_domain_1.conf
sudo a2ensite your_domain_2.conf

两个站点都会有输出,类似于下面的示例,提醒您重新加载 Apache 服务器:

OutputEnabling site example.com.
To activate the new configuration, you need to run:
  systemctl reload apache2

在重新加载服务器之前,使用 a2dissite 命令禁用 000-default.conf 中定义的默认站点:

sudo a2dissite 000-default.conf
OutputSite 000-default disabled.
To activate the new configuration, you need to run:
  systemctl reload apache2

接下来,测试配置错误:

sudo apache2ctl configtest

应该收到以下输出:

Output. . .
Syntax OK

完成后,重新启动 Apache 以使这些更改生效。

sudo systemctl restart apache2

或者,您可以使用以下命令在所有这些更改后检查服务器的状态:

sudo systemctl status apache2

您的服务器现在应该设置为服务两个网站。 如果您使用的是真实域名,则可以跳过第 6 步并继续执行第 7 步。 如果您在本地测试您的配置,请按照步骤 6 了解如何使用本地计算机测试您的设置。

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

如果您没有使用您拥有的实际域名来测试此过程,而是使用示例域,您仍然可以通过临时修改您的 hosts 文件来测试您的虚拟主机站点的功能。本地计算机。 这将拦截对您配置的域的任何请求,并将它们指向您的虚拟专用服务器 (VPS),就像 DNS 系统在您使用注册域时所做的那样。 这仅适用于您的本地计算机,并且仅用于测试目的。

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

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

sudo nano /etc/hosts

如果您使用的是 Windows 计算机,请打开命令提示符并键入:

notepad %windir%\system32\drivers\etc\hosts

您需要添加的详细信息是服务器的公共 IP 地址,然后是您要用于访问该服务器的域。 使用本指南中使用的域,并将您的服务器 IP 替换为 your_server_IP 文本,您的文件应如下所示:

/etc/hosts

127.0.0.1   localhost
127.0.1.1   guest-desktop
your_server_IP your_domain_1
your_server_IP your_domain_2

这将在您的计算机上引导对您的两个域的任何请求,并将它们发送到您指定 IP 地址的服务器。

保存并关闭文件。

第 7 步——测试你的结果

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

http://your_domain_1

您还可以访问您的第二个主机页面并查看您为第二个站点创建的文件:

http://your_domain_2

如果这两个站点都按预期工作,那么您已经成功地在同一台服务器上配置了两个虚拟主机。

注意: 如果您调整了本地计算机的主机文件,就像在本教程的第 6 步中一样,您可能需要删除添加的行,因为您已验证您的配置有效。 这将防止您的 hosts 文件被不再需要的条目填充。


结论

您现在有一个服务器处理两个单独的域名。 您可以按照我们上面概述的步骤来扩展此过程以添加其他虚拟主机。 Apache 可以处理的域名数量没有软件限制,因此您可以随意创建尽可能多的虚拟主机,只要您的服务器能够处理。