Apache Web 服务器是在互联网上提供 Web 内容的最流行的方式。它占互联网上所有活跃网站的一半以上,并且非常强大和灵活。
Apache 将其功能和组件分解为可以独立定制和配置的单独单元。描述单个站点或域的基本单位称为virtual host
.
这些指定允许管理员通过匹配机制使用一台服务器来托管来自单个接口或 IP 的多个域或站点。这与任何希望在一台服务器上托管多个站点的人相关。
配置的每个域都会将访问者引导到保存该站点信息的特定目录,而不会表明同一服务器还负责其他站点。只要您的服务器可以处理负载,该方案就可以扩展,没有任何软件限制。
在本指南中,我们将引导您了解如何在 Ubuntu 16.04 服务器上设置 Apache 虚拟主机。在此过程中,您将学习如何根据不同的访问者请求的域向他们提供不同的内容。
在开始本教程之前,您应该创建一个启用 sudo 的非root user如此处步骤 1-4 中所述。
您还需要安装 Apache 才能完成这些步骤。如果您还没有这样做,您可以通过以下方式在您的服务器上安装 Apacheapt-get
:
-
sudo apt-get update
-
sudo apt-get install阿帕奇2
完成这些步骤后,我们就可以开始了。
出于本指南的目的,我们的配置将为example.com
另一个用于test.com
。这些将在整个指南中引用,但您应该在遵循时替换您自己的域或值。
如果您使用虚拟值,我们稍后将展示如何编辑本地主机文件以测试配置。这将允许您从家庭计算机测试您的配置,即使其他访问者无法通过域名访问您的内容。
我们要采取的第一步是创建一个目录结构来保存我们将向访问者提供的站点数据。
Our document root
(Apache 查看以查找要提供的内容的顶级目录)将被设置为/var/www
目录。我们将在这里为我们计划创建的两个虚拟主机创建一个目录。
每个内these目录,我们将创建一个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
The $USER
当您按下时,变量将采用您当前登录的用户的值ENTER
。通过这样做,我们的普通用户现在拥有public_html
我们将在其中存储内容的子目录。
我们还应该稍微修改一下权限,以确保允许对常规 Web 目录及其包含的所有文件和文件夹进行读取访问,以便可以正确提供页面:
-
sudo chmod -R 755/var/www
您的 Web 服务器现在应该拥有提供内容所需的权限,并且您的用户应该能够在必要的文件夹中创建内容。
我们已经有了适当的目录结构。让我们创建一些内容来提供服务。
我们只是为了演示,所以我们的页面会非常简单。我们只是要做一个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>
保存并关闭该文件。您现在拥有测试虚拟主机配置所需的页面。
虚拟主机文件是指定虚拟主机的实际配置并指示 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>
正如你所看到的,这里没有太多内容。我们将为我们的第一个域自定义此处的项目并添加一些附加指令。此虚拟主机部分匹配any在端口 80(默认 HTTP 端口)上发出的请求。
首先,我们需要改变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
工具来启用我们的每个站点,如下所示:
-
sudo a2ensite example.com.conf
-
sudo a2ensite test.com.conf
接下来,禁用中定义的默认站点000-default.conf
:
-
sudoa2dissite 000-default.conf
完成后,您需要重新启动 Apache 以使这些更改生效:
-
sudosystemctl 重新启动 apache2
如果您尚未使用自己拥有的实际域名来测试此过程,而是使用了一些示例域,那么您至少可以通过临时修改hosts
文件在您的本地计算机上。
这将拦截对您配置的域的任何请求,并将它们指向您的服务器,就像您使用注册域时 DNS 系统所做的那样。不过,这只适用于您的计算机,并且仅用于测试目的。
确保您在本地计算机上而不是服务器上执行这些步骤。您需要知道计算机的管理密码或者是管理组的成员。
如果您使用的是 Mac 或 Linux 计算机,请通过键入以下内容以管理权限编辑本地文件:
-
sudo nano/etc/主机
如果您使用的是 Windows 计算机,您可以查找有关更改主机文件的说明 here.
您需要添加的详细信息是 VPS 服务器的公共 IP 地址,后跟您要用于访问该 VPS 的域。
对于我在本指南中使用的域,假设我的 VPS IP 地址是203.0.113.10
,我可以将以下行添加到主机文件的底部:
/etc/主机
127.0.0.1 localhost
127.0.1.1 guest-desktop
203.0.113.10 example.com
203.0.113.10 test.com
这将引导任何请求example.com
and test.com
在我们的计算机上并将它们发送到我们的服务器203.0.113.10
。如果我们实际上不是这些域的所有者,那么为了测试我们的虚拟主机,这就是我们想要的。
保存并关闭文件。
现在您已经配置了虚拟主机,您可以通过转到您在 Web 浏览器中配置的域来轻松测试您的设置:
http://example.com
您应该看到如下所示的页面:
同样,如果您可以访问第二页:
http://test.com
您将看到为第二个站点创建的文件:
如果这两个站点都运行良好,则您已成功配置two同一服务器上的虚拟主机。
如果您调整了家庭计算机的主机文件,则在验证配置有效后,您可能需要删除添加的行。这将防止您的主机文件被实际不需要的条目填充。
如果您需要长期访问,请考虑为您需要的每个网站购买一个域名,并将其设置为指向您的 VPS 服务器.
如果您继续操作,您现在应该有一个服务器处理两个单独的域名。您可以按照我们上面概述的步骤来扩展此过程以创建其他虚拟主机。
Apache 可以处理的域名数量没有软件限制,因此您可以随意创建您的服务器能够处理的域名数量。