前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
Apache web 服务器是在互联网上提供 web 内容的最流行方式。它占据了互联网上超过一半的活跃网站,并且非常强大和灵活。
Apache 将其功能和组件分解为可以独立定制的单个单元。描述单个站点或域的基本单元称为虚拟主机。
使用虚拟主机,您可以使用一个服务器在单个接口或 IP 上托管多个域或站点,通过使用匹配机制。您可以配置对域的请求,将访问者定向到保存该站点信息的特定目录。换句话说,您可以在单个服务器上托管多个网站。只要您的服务器能够处理负载,这种方案就可以扩展,没有任何软件限制。
在本教程中,您将在 Debian 8 服务器上设置两个 Apache 虚拟主机,根据访问的域向访问者提供不同的内容。
先决条件
要完成本教程,您需要:
- 一个具有 sudo 权限的非 root 用户的 Debian 8 服务器。您可以按照我们的《在 Debian 8 上进行初始服务器设置》指南中设置具有这些权限的用户。
- 已安装和配置 Apache,如《如何在 Debian 8 上安装 Linux、Apache、MySQL、PHP(LAMP)堆栈》中所示。
在本指南中,我们将为 example.com
和 test.com
创建虚拟主机,但您可以在跟随时替换为自己的域或值。要将您的域名指向您的服务器,请参阅我们的教程《如何在 DigitalOcean 上设置主机名》。
如果您没有可用于操作的域,可以使用 example.com
和 test.com
,并按照本教程的第 5 步配置本地 hosts 文件,将这些域映射到您服务器的 IP 地址。这将允许您从本地计算机测试您的配置。
步骤 1 —— 创建目录结构
我们要采取的第一步是创建一个目录结构,用于保存我们将提供给访问者的站点数据。
我们的文档根目录,Apache 用来查找要提供的内容的顶级目录,将设置为 /var/www
目录下的各个目录。我们将为我们配置的每个虚拟主机创建一个目录。
在这些目录中,我们将创建一个名为 public_html
的文件夹,用于保存我们要提供的网页。这样可以在将来部署更复杂的 web 应用程序时提供更大的灵活性;public_html
文件夹将保存我们要提供的 web 内容,父文件夹可以保存支持 web 内容的脚本或应用程序代码。
使用以下命令创建目录:
sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/test.com/public_html
由于我们使用 sudo
创建了这些目录,它们归根用户所有。如果我们希望我们的常规用户能够修改我们的 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 目录及其包含的所有文件和文件夹进行读取访问,以便可以正确提供页面。执行以下命令以更改 /var/www
文件夹及其子文件夹的权限:
sudo chmod -R 755 /var/www
如果您是 Linux 权限管理的新手,请参阅本教程。
您的 web 服务器现在应该具有提供内容所需的权限,您的用户应该能够在必要的文件夹中创建内容。让我们为每个站点创建一个 HTML 文件。
我们已经设置好了目录结构。让我们创建一些要提供的内容。
步骤 2 —— 为每个虚拟主机创建默认页面
让我们为每个站点创建一个简单的 index.html
页面。这将帮助我们确保稍后正确配置我们的虚拟主机。
让我们从 example.com
的页面开始。使用以下命令编辑一个新的 index.html
文件:
nano /var/www/example.com/public_html/index.html
在此文件中,创建一个简单的 HTML 文档,指示访问者正在查看 example.com
的主页:
<html><head><title>Welcome to Example.com!</title></head><body><h1>Success! The example.com virtual host is working!</h1></body>
</html>
完成后保存并关闭文件。
现在将此文件复制到 test.com
站点:
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
更改文件,使其引用 test.com
而不是 example.com
:
<html><head><title>Welcome to Test.com!</title></head><body><h1>Success! The test.com virtual host is working!</h1></body>
</html>
完成后保存并关闭文件。现在您已经拥有测试虚拟主机配置所需的页面。接下来,让我们配置虚拟主机。
步骤 3 —— 创建新的虚拟主机文件
虚拟主机文件指定了我们的虚拟主机的实际配置,并决定了 Apache Web 服务器如何响应各种域请求。
Apache 自带一个名为 000-default.conf
的默认虚拟主机文件,您可以将其用作起点。首先,复制该文件以创建第一个域:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf
使用编辑器打开新文件:
sudo nano /etc/apache2/sites-available/example.com.conf
文件将类似于以下示例,并带有一些额外的注释:
<VirtualHost *:80>ServerAdmin webmaster@localhostDocumentRoot /var/www/htmlErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combined</VirtualHost>
这个虚拟主机匹配在端口 80
上进行的任何请求,即默认的 HTTP 端口。让我们对此配置进行一些更改,并添加一些新的指令。
首先,将 ServerAdmin
指令更改为站点管理员可以接收邮件的电子邮件地址。
ServerAdmin admin@example.com
接下来,我们需要添加两个新的指令。第一个叫做 ServerName
,用于为此虚拟主机定义基本域。第二个叫做 ServerAlias
,定义进一步的名称,这些名称应该与基本名称匹配。这对于匹配您定义的其他主机非常有用,因此 example.com
和 www.example.com
都可以工作,只要这两个主机都指向此服务器的 IP 地址。
在 ServerAdmin
行后面将这两个指令添加到您的配置文件中:
<VirtualHost *:80>ServerAdmin webmaster@localhostServerName example.comServerAlias www.example.comDocumentRoot /var/www/html
...
接下来,通过修改 DocumentRoot
指令来更改此域的文档根目录的位置,指向您为此主机创建的目录:
DocumentRoot /var/www/example.com/public_html
完成这些更改后,您的文件应如下所示:
<VirtualHost *:80>ServerAdmin admin@example.comServerName example.comServerAlias www.example.comDocumentRoot /var/www/example.com/public_htmlErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
保存并关闭文件。
然后通过创建此文件的副本来创建第二个配置文件:
sudo cp /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-available/test.com.conf
使用编辑器打开新文件:
sudo nano /etc/apache2/sites-available/test.com.conf
然后更改相关设置以引用您的第二个域。完成后,您的文件将如下所示:
<VirtualHost *:80>ServerAdmin admin@test.comServerName test.comServerAlias www.test.comDocumentRoot /var/www/test.com/public_htmlErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
保存并关闭文件。
现在我们已经创建了虚拟主机文件,我们可以启用它们。
步骤 4 —— 启用新的虚拟主机文件
您已经创建了文件夹和虚拟主机配置文件,但 Apache 不会使用它们,直到您激活它们。您可以使用 a2ensite
工具来启用每个站点。
激活第一个站点:
sudo a2ensite example.com.conf
如果您的文件中没有语法错误或拼写错误,您将看到以下输出:
Enabling site example.com.
To activate the new configuration, you need to run:service apache2 reload
为了使您的更改生效,您必须重新加载 Apache。但在这样做之前,启用其他站点:
sudo a2ensite test.com.conf
您将看到类似的消息,指示站点已启用:
Enabling site test.com.
To activate the new configuration, you need to run:service apache2 reload
接下来,通过使用 a2dissite
命令来禁用 000-default.conf
中定义的默认站点:
sudo a2dissite 000-default.conf
现在,重新启动 Apache:
sudo systemctl restart apache2
现在站点已经配置好了。让我们来测试一下。如果您正在使用配置为指向您服务器 IP 地址的真实域,您可以跳过下一步。但如果您的域名尚未传播,或者只是在测试,继续阅读以了解如何使用您的本地计算机测试此设置。
步骤 5 — 设置本地 Hosts 文件(可选)
如果您一直在使用一些示例域名而不是您拥有的实际域名来测试此过程,您可以通过临时修改本地计算机上的 hosts
文件来测试此过程的功能性。
这将拦截您配置的任何域名的请求,并将它们指向您的 VPS 服务器,就像 DNS 系统在您使用注册域名时所做的那样。但这只对您的计算机有效,仅用于测试目的。
确保您在本地计算机上执行这些步骤,而不是在 VPS 服务器上。您还需要知道本地计算机的管理员密码或者是管理员组的成员。
如果您使用的是 Mac 或 Linux 计算机,请使用管理员权限编辑本地文件,输入以下命令:
[environment local]
sudo nano /etc/hosts
如果您使用的是 Windows,请以管理员权限打开命令提示符,输入以下命令:
[environment local]
notepad %windir%\system32\drivers\etc\hosts
打开文件后,添加一行将您服务器的公共 IP 地址映射到每个域名,如下例所示:
127.0.0.1 localhost
...111.111.111.111 example.com
111.111.111.111 test.com
这将在您的计算机上将任何对 example.com
和 test.com
的请求发送到您的服务器 111.111.111.111
。
保存并关闭文件。现在您可以测试您的设置。当您确信一切正常运行时,从文件中删除这两行。
步骤 6 — 测试您的结果
现在您已经配置了虚拟主机,可以通过在 Web 浏览器中访问您配置的域名来轻松测试您的设置。访问第一个站点 http://example.com
,您将看到一个类似以下的页面:
!Apache example.com result
同样,如果您访问第二个主机 http://test.com
,您将看到您为第二个站点创建的文件:
!Apache test.com result
如果这两个站点都正常工作,您已成功在同一服务器上配置了两个虚拟主机。
结论
现在您的单个服务器可以处理两个独立的域名。您可以通过按照这些步骤添加额外的虚拟主机来扩展此过程。
Apache 可以处理的域名数量没有软件限制,因此可以根据服务器的处理能力自由添加。
要使用 Apache 提供安全内容,请按照教程《如何在 Debian 8 上使用 Let’s Encrypt 保护 Apache》。要在 Web 应用程序前使用 Apache,请按照《如何在 Debian 8 上使用 mod_proxy 作为反向代理使用 Apache》。