介绍
Apache Web 服务器是一种在 Internet 上为网站提供服务的流行方法。 截至 2019 年,它估计为 29% of 所有活跃网站提供服务,它为开发人员提供了稳健性和灵活性。 使用 Apache,管理员可以通过使用匹配系统设置一台服务器来托管多个域或站点,使其脱离单个接口或 IP。
使用 Apache 配置的每个域或单个站点(称为“虚拟主机”)会将访问者引导到包含该站点信息的特定目录。 这样做没有表明同一服务器也负责其他站点。 只要您的服务器可以处理负载,此方案就可以扩展,没有任何软件限制。 描述单个站点或域的基本单元称为 virtual host
。
在本指南中,我们将引导您了解如何在 Ubuntu 18.04 服务器上设置 Apache 虚拟主机。 在此过程中,您将学习如何根据不同的访问者请求的域向不同的访问者提供不同的内容。
先决条件
在开始本教程之前,您应该 创建一个非 root 用户 。
您还需要安装 Apache 才能完成这些步骤。 如果您还没有这样做,您可以通过 apt
包方式在您的服务器上安装 Apache:
sudo apt update sudo apt install apache2
如果您需要更详细的说明以及防火墙设置,请参阅我们的指南 如何在 Ubuntu 18.04 上安装 Apache Web 服务器。
出于本指南的目的,我们的配置将为 example.com
创建一个虚拟主机,为 test.com
创建一个虚拟主机。 这些将在整个指南中被引用,但您应该在跟随时替换您自己的域或值。
如果您使用的是 DigitalOcean,您可以按照产品文档 如何添加域 来学习如何设置域。 对于其他提供商,请参阅他们的相关产品文档。如果您 没有 目前有可用的域,您可以使用测试值。
如果您使用测试值,我们稍后将展示如何编辑本地主机文件以测试配置。 这将允许您从家用计算机验证您的配置,即使您的内容无法通过域名提供给其他访问者。
第一步——创建目录结构
我们要采取的第一步是创建一个目录结构来保存我们将提供给访问者的站点数据。
我们的 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 服务的域名。
第二步——授予权限
现在我们有了文件的目录结构,但它们归我们的 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 服务器现在应该具有提供内容所需的权限,并且您的用户应该能够在必要的文件夹中创建内容。
第三步——为每个虚拟主机创建演示页面
我们现在有了我们的目录结构。 让我们创建一些内容来提供服务。
出于演示目的,我们将为每个站点制作一个 index.html
页面。
让我们从 example.com
开始。 我们可以在文本编辑器中打开一个 index.html
文件,在这种情况下我们将使用 nano:
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>
完成后保存并关闭文件(在 nano 中,按 CTRL
+ X
然后 Y
然后 ENTER
)。
我们可以通过键入以下内容复制此文件以用作我们第二个站点的基础:
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>
保存并关闭此文件。 您现在拥有测试虚拟主机配置所需的页面。
第四步——创建新的虚拟主机文件
虚拟主机文件是指定我们虚拟主机的实际配置并指示 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>
完成后保存并关闭文件。
第五步——启用新的虚拟主机文件
现在我们已经创建了虚拟主机文件,我们必须启用它们。 Apache 包含一些允许我们执行此操作的工具。
我们将使用 a2ensite
工具来启用我们的每个站点。 如果你想了解更多关于这个脚本的信息,你可以参考a2ensite 文档。
sudo a2ensite example.com.conf sudo a2ensite test.com.conf
接下来,禁用 000-default.conf
中定义的默认站点:
sudo a2dissite 000-default.conf
完成后,需要重启 Apache 才能使这些更改生效,并使用 systemctl status
验证重启是否成功。
sudo systemctl restart apache2 sudo systemctl status apache2
您的服务器现在应该设置为服务两个网站。
第六步 — 设置本地主机文件(可选)
如果您没有使用您拥有的实际域名来测试此过程,而是使用了一些示例域,您至少可以通过临时修改本地上的 hosts
文件来测试此过程的功能电脑。
这将拦截对您配置的域的任何请求,并将它们指向您的 VPS 服务器,就像 DNS 系统在您使用注册域时所做的那样。 但是,这仅适用于您的本地计算机,并且仅用于测试目的。
确保您在本地计算机上操作这些步骤,而不是您的 VPS 服务器。 您将需要知道计算机的管理密码或以其他方式成为管理组的成员。
如果您使用的是 Mac 或 Linux 计算机,请使用管理员权限编辑本地文件,方法是键入:
sudo nano /etc/hosts
如果您使用的是 Windows 机器,您可以 在此处 找到更改主机文件的说明。
您需要添加的详细信息是您的服务器的公共 IP 地址,后跟您要用于访问该服务器的域。
使用本指南中使用的域,并将您的服务器 IP 替换为 your_server_IP
文本,您的文件应如下所示:
/etc/hosts
127.0.0.1 localhost 127.0.1.1 guest-desktop your_server_IP example.com your_server_IP test.com
保存并关闭文件。
这将引导我们计算机上对 example.com
和 test.com
的任何请求,并将它们发送到我们的服务器。 如果我们实际上不是这些域的所有者来测试我们的虚拟主机,这就是我们想要的。
第七步——测试你的结果
现在您已经配置了虚拟主机,您可以通过转到您在 Web 浏览器中配置的域来测试您的设置:
http://example.com
您应该会看到如下所示的页面:
您还可以访问您的第二个页面并查看您为第二个站点创建的文件。
http://test.com
如果这两个站点都按预期工作,那么您已经在同一台服务器上成功配置了 two 虚拟主机。
如果您调整了家用计算机的 hosts 文件,您可能想要删除添加的行,因为您已经验证了您的配置有效。 这将防止您的主机文件被不再需要的条目填充。
如果您需要长期访问,请考虑为您需要的每个站点添加一个域名,并 将其设置为指向您的服务器 。
结论
如果您继续,您现在应该有一个服务器处理两个单独的域名。 您可以按照我们上面概述的步骤来扩展此过程以创建其他虚拟主机。
Apache 可以处理的域名数量没有软件限制,所以您可以随意制作尽可能多的服务器能够处理的域名。