Apache虚拟主机使您可以在一台服务器上运行多个网站。对于每个网站,您可以设置站点文档根目录,包含网站文件的目录,创建单独的安全策略,使用不同的SSL证书等等。

本教程介绍如何在Ubuntu 20.04配置Apache虚拟主机。包括创建Apache的文档根目录,创建Apache虚拟主机。

说明Apache虚拟主机常见指令如DocumentRoot,ServerName,Directory。自定义Apache日志格式与存储目录。使用apachectl命令验证配置文件语法。

在继续学习本教程之前,请确保您满足这些要求,一个域名指向您的服务器IP。已经在Ubuntu 20.04安装Apache。您以root或具有sudo权限的用户登录。

DocumentRoot文档根目录是一个目录,用于存储指向该域名的网站文件,以响应请求。你可以将文档根目录设置为所需的任何位置,

但Apache必须有读取权限,对于可执行文件,例如php。nginx必须对其有可执行权限,否则Apache返回500内部服务器的错误。

在此示例中我们将使用目录/var/www/example.com/public_html。作为Apache虚拟主机的的文档根目录。

你可以使用命令sudo mkdir -p /var/www/example.com/public_html创建目录。我们还将在需要文档根目录中创建一个index.html文件。

echo "hello myfreax.com" | sudo tee /var/www/example.com/public_html/index.html命令将会使用tee命令创建index.html文件。当您在浏览器中访问该域时会显示该文件。

由于上述命令是作为sudo用户执行的,因此新创建的文件和目录归root所有。为了避免权限问题。

请将文档根目录的所有权以及该目录中所有文件的所有权更改为apache用户所有。运行chown命令

sudo mkdir -p /var/www/example.com/public_html

echo "hello myfreax.com" | sudo tee /var/www/example.com/public_html/index.html

sudo chown -R www-data: /var/www/example.com

创建虚拟主机

有几种方法可以设置虚拟主机。通常,您应该选择第二种方法,因为这种方法更易于维护。

第一种是将所有虚拟主机指令添加到一个文件中,第二种是为每个虚拟主机指令创建一个新的配置文件。

默认情况下,Apache会加载/etc/apache2/sites-enabled/目录中所有以.conf结尾的配置文件。

要为指定的网站创建Apache虚拟主机,你可以在/etc/apache2/sites-enabled/目录添加以.conf结尾的文件。

例如我们将为example.com创建虚拟主机配置文件,请使用你喜欢的编辑器创建虚拟主机配置/etc/apache2/sites-enabled/example.com.conf

在本教程我们将继续使用vim编辑器创建文件/etc/apache2/sites-enabled/example.com.conf

你可以将配置文件命名为任意名称,但是通常最好使用域名,因此我们使用domain1.com.conf作为配置文件的名称。

sudo vim /etc/apache2/sites-enabled/example.com.conf

复制并粘帖以下内容到虚拟主机配置文件中:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/example.com/public_html

    <Directory /var/www/example.com/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
    </Directory>

     ErrorLog ${APACHE_LOG_DIR}/domain1.com-error.log
    CustomLog ${APACHE_LOG_DIR}/domain1.com-access.log combined
</VirtualHost>

ServerName指令指定是Apache虚拟主机所使用的域名。ServerAlias指令允许你为Apache虚拟主机指定多个域名或者子域。例如www子域。

DocumentRoot指令设置Apache虚拟主机文档根目录,当你在浏览器打开你的域名时,将此目录检索文件。

Options指令控制Apache虚拟主机每个目录的能力,例如目录是否可索引。是否跟随软连接,包含其它Apache模块,是否允许执行CGI脚本等。

-Indexes表示指定是否允许列出目录,前面是- 表示不允许,如果你需要列出目录,可以换成加号+

FollowSymLinks此选项告诉Web服务器遵循符号链接。AllowOverride指定.htaccess文件中声明的指令可以覆盖配置指令。

最后两行指定日志文件的存储位置,这里分别定义错误日志文件和自定义文件的位置。

ErrorLog错误日志文件保存在/var/log/httpd/example.com-error.logCustomLog还允许你指定日志格式,这里使用Apache预设日志格式combined

现在你已经了解每一个选项含义,当修改完成后,保存并退出vim编辑器。当完成对Apache配置文件修改后。

第一件事是首先测试所有Apache配置文件是否正确,不是重启Apache以验证配置是否可用。

Apache提供apachectl命令可用于对配置文件语法的验证,可运行sudo apachectl configtest命令测试配置文件的语法,如果语法正确将会输出Syntax OK

你可能还会看到的消息如下,出现这个消息的原因是,localhost.localdomain域名不可达导致的。这仅仅是一个警告,可以不用理会。

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message

如果没有错误,则输出将提示Syntax OK。要激活新创建的虚拟主机,运行systemctl命令重新启动Apache服务。

为了能够正确解释域名example.com。因此我们还需要映射example1.com本地回环地址127.0.0.1,运行命令echo "127.0.0.1 example.com" | sudo tee -a /etc/hosts

最后,要验证Nginx虚拟主机是否按预期工作,请在您选择的浏览器中打开http://example.com

sudo apachectl configtest
echo "127.0.0.1 example.com" | sudo tee -a /etc/hosts
sudo systemctl apache2.service

结论

您已经学习了如何创建apache虚拟主机配置以在单个Ubuntu服务器上托管多个域。重复上述步骤,为您所有的域创建其他虚拟主机。如果您遇到任何问题,请随时发表评论。