如何配置 Apache 虚拟主机

在 Apache (httpd) 中,虚拟主机用于托管来自同一服务器的多个域的 Web 内容,具体取决于所使用的 IP 地址或者域名。
根据收到的请求,可以应用不同的虚拟主机配置,从而导致从单个 Web 服务器提供不同的设置和 Web 内容。
例如,具有一个 IP 地址的 Web 服务器可以托管多个域名,例如 example.com 和 example.org 等等。

在这里,我们将介绍如何为 Apache 2.4 配置虚拟主机,以便我们可以根据请求让多个域为不同的网站提供服务。

测试虚拟主机

一旦虚拟主机配置到位并重新加载 Apache,将需要创建相关的 DNS 记录,以便域将解析到 Web 服务器。
或者,我们可以通过修改主机文件进行测试。
在本例中,我们可以修改 /etc/hosts 文件并添加以下条目。

127.0.0.1 example.com www.example.com example.org www.example.org

这将使这些域解析为 localhost,现在我们可以浏览内容并确认我们的虚拟主机是否正常工作。
在本例中,我们将使用 curl 命令查看每个网站的内容。

[jack@onitroad ~]# curl example.com
example.com website
[jack@onitroad ~]# curl example.org
example.org website

这确认了虚拟主机配置中所定义的 /var/www/html/example1 和 /var/www/html/example2 中的 index.html 页面正确。

Apache 虚拟主机配置示例

虚拟主机配置通常放在 /etc/httpd/conf/httpd.conf 文件中,也放在 /etc/httpd/conf.d 目录中唯一的 .conf 文件中。
如果我们要添加多个要从同一 Web 服务器托管的网站,最好在 /etc/httpd/conf.d 中创建一个新的 .conf 文件,因为这样可以保持配置干净且更易于管理。
在我们的示例中,我们将使用 /etc/httpd/conf.d/example1.conf 用于网站 www.example.com 和 /etc/httpd/conf.d/example2.conf 用于网站www.example.org。

首先,我们将从一些示例虚拟主机配置开始,然后讨论每行实际在做什么。
有关其他示例,请参阅 Apache 文档。

下面的示例虚拟主机配置已保存在 /etc/httpd/conf.d/example1.conf 文件中。

<Directory /var/www/html/example1>
    Require all granted
</Directory>
<VirtualHost *:80>
    DocumentRoot "/var/www/html/example1"
    ServerName www.example.com
    ServerAlias example.com
    ServerAdmin jack@onitroad
    ErrorLog "/var/log/httpd/error_log_example1"
    CustomLog "/var/log/httpd/access_log_example1" combined
</VirtualHost>

下面的示例虚拟主机配置已保存在 /etc/httpd/conf.d/example2.conf 文件中。

<Directory /var/www/html/example2>
    Require all granted
</Directory>
<VirtualHost *:80>
    DocumentRoot "/var/www/html/example2"
    ServerName www.example.org
    ServerAlias example.org
    ServerAdmin jack@onitroad
    ErrorLog "/var/log/httpd/error_log_example2"
    CustomLog "/var/log/httpd/access_log_example2" combined
</VirtualHost>

在上面的例子中,我们有两个虚拟主机配置块。
第一个用于 www.example.com,而第二个用于 www.example.org。
下面我们将解释 example1/example.com 虚拟主机的每一行,因为两者的配置基本相同。

  • <Directory /var/www/html/example1> - 这将打开目录标记并用于包含一组适用于指定目录的指令。
  • Require all granted - 这是授予访问权限所必需的,如果没有它,Apache 日志将显示“authz_core:error”作为 /etc/http/conf/httpd.conf 文件中的默认配置,将“/”目录定义为“Require全部否认”。
  • </Directory> - 关闭目录标签。
  • <VirtualHost :80> - 此虚拟主机标记表示其后的配置将应用于任何 IP 地址,如端口 80 上的“”,“*”可以改为修改为服务器上可用的特定 IP 地址.如果在主 httpd.conf 文件中定义了该端口的 Listen 指令,则也可以更改该端口。
  • DocumentRoot "/var/www/example1" - 文档根目录是我们访问域名时 Apache 应该提供的内容所在的目录,在这种情况下,访问 www.example.com 会将我们定向到 /var 中的文件Web 服务器上的 /www/example1 目录。指定的目录应该存在并且最好包含内容。
  • ServerName www.example.com - 这是虚拟主机的唯一名称,在这种情况下,虚拟主机配置块用于 www.example.com 网站。
  • ServerAlias example.com - 匹配请求时可以使用备用名称,并使用 ServerAlias 指定,这些允许我们提供其他基于名称的别名,因为每个虚拟主机只允许一个 ServerName。
  • ServerAdmin jack@onitroad - 这是错误消息中提供的电子邮件地址,允许用户联系 Web 服务器的 Web 管理员。
  • ErrorLog "/var/log/httpd/error_log_example1" - 这是存储与此虚拟主机相关的错误日志的文件,在解决问题时很有用。
  • CustomLog "/var/log/httpd/access_log_example1" 组合 - 这是存储访问日志的地方,例如,当客户端查看网页时,访问请求将记录在此处。
  • </VirtualHost> - 这是虚拟主机块的结束标记,表示特定虚拟主机的配置结束。

如果虚拟主机中缺少任何配置,则将使用主 /etc/httpd/conf/httpd.conf 文件中指定的默认值。

example2.conf 文件中的第二个虚拟主机块大部分是相同的,除了它处理对 www.example.org 和 example.org 的请求,提供 /var/www/html/example2 中的内容。
错误被记录到 /var/log/httpd/error_log_example2 并且访问请求被记录到 /var/log/httpd/access_log_example2.

可以使用“apachectl configtest”命令测试我们两个 .conf 文件的语法,如下所示。
在这种情况下,文档根目录尚未创建,因此我们会收到警告并应创建这些。

[jack@onitroad ~]# apachectl configtest
AH00112: Warning: DocumentRoot [/var/www/html/example1] does not exist
AH00112: Warning: DocumentRoot [/var/www/html/example2] does not exist
Syntax OK

可以使用 mkdir 创建目录,如下所示。

mkdir /var/www/html/example1
mkdir /var/www/html/example2

现在我们的目录已经存在,警告应该不会再出现了。
在这个例子中,我在两个目录中用文本编辑器创建了两个 index.html 文件,内容如下所示。

[jack@onitroad ~]# cat /var/www/html/example1/index.html
example.com website
[jack@onitroad ~]# cat /var/www/html/example2/index.html
example.org website

在测试我们的虚拟主机配置之前,对 Apache 配置文件的任何更改(例如对虚拟主机的修改)都需要重新启动或者重新加载 httpd 服务以获取配置更改。
Apache 可以通过“systemctl reload httpd”重新加载以利用配置更改,有关更多信息,请参阅我们的服务管理教程。

日期:2020-07-07 20:54:53 来源:oir作者:oir