如何在 Ubuntu 16.04 上设置 Nginx 服务器块(虚拟主机)

介绍

使用 Nginx Web 服务器时,服务器块(类似于 Apache 中的虚拟主机)可用于封装配置细节并在一台服务器上托管多个域。

在本指南中,我们将讨论如何在 Ubuntu 16.04 服务器上的 Nginx 中配置服务器块。

先决条件

sudo在本教程中,我们将使用具有特权的非 root 用户如果您没有配置这样的用户,您可以按照我们的Ubuntu 16.04 初始服务器设置指南创建一个

您还需要在服务器上安装 Nginx。以下指南涵盖了此过程:

满足这些要求后,您可以继续阅读本指南。

示例配置

出于演示目的,我们将使用 Nginx 服务器设置两个域。我们将在本指南中使用的域名是example.comtest.com

注意:有关使用 DigitalOcean 设置域的更多信息,请参阅我们的域和 DNS 产品文档

如果您没有两个备用域名可供使用,请暂时使用占位符名称,稍后我们将向您展示如何配置本地计算机以测试您的配置。

步骤 1 — 设置新的文档根目录

默认情况下,Ubuntu 16.04 上的 Nginx 启用了一个服务器块。它被配置为从/var/www/html.

虽然这适用于单个站点,但如果我们要为多个站点提供服务,我们需要额外的目录。/var/www/html如果客户端请求与我们的任何其他站点都不匹配,我们可以将目录视为将提供服务的默认目录。

我们将为/var/www每个站点创建一个目录结构实际的 Web 内容将放置在html这些特定于站点的目录中的目录中。这为我们提供了一些额外的灵活性,可以html在必要时创建与我们的站点关联的其他目录作为该目录的兄弟目录。

我们需要为我们的每个站点创建这些目录。-p标志告诉mkdir在此过程中创建任何必要的父目录:

  • sudo mkdir -p /var/www/example.com/html
  • sudo mkdir -p /var/www/test.com/html

现在我们有了我们的目录,我们将把 Web 目录的所有权重新分配给我们的普通用户帐户。这将使我们无需sudo.

注意:根据您的需要,您可能需要再次调整文件夹的权限或所有权,以允许对www-data用户进行某些访问例如,动态站点通常需要这个。具体的权限和所有权要求完全取决于您的配置。遵循针对您正在使用的特定技术的建议。

我们可以使用$USER环境变量将所有权分配给我们当前登录的帐户(确保您没有以root身份登录)。这将允许我们轻松创建或编辑此目录中的内容:

  • sudo chown -R $USER:$USER /var/www/example.com/html
  • sudo chown -R $USER:$USER /var/www/test.com/html

如果您没有修改您的umask值,我们的网络根目录的权限应该已经正确,但我们可以通过键入以下内容来确保:

  • sudo chmod -R 755 /var/www

我们的目录结构现在已经配置好了,我们可以继续了。

步骤 2 — 为每个站点创建示例页面

现在我们已经设置了目录结构,让我们为每个站点创建一个默认页面,以便我们可以显示一些内容。

index.html在您的第一个域中创建一个文件:

  • nano /var/www/example.com/html/index.html

在该文件中,我们将创建一个非常基本的文件,指示我们当前正在访问的站点。它看起来像这样:

/var/www/example.com/html/index.html
<html>
    <head>
        <title>Welcome to Example.com!</title>
    </head>
    <body>
        <h1>Success! The example.com server block is working!</h1>
    </body>
</html>

完成后保存并关闭文件。要在 中执行此操作nano,请按CTRL+o将文件写出,然后CTRL+x按 退出。

由于我们第二个站点的文件基本相同,我们可以将它复制到我们的第二个文档根目录,如下所示:

  • cp /var/www/example.com/html/index.html /var/www/test.com/html/

现在,我们可以在编辑器中打开新文件:

  • nano /var/www/test.com/html/index.html

修改它,使其指向我们的第二个域:

/var/www/test.com/html/index.html
<html>
    <head>
        <title>Welcome to Test.com!</title>
    </head>
    <body>
        <h1>Success!  The test.com server block is working!</h1>
    </body>
</html>

完成后保存并关闭此文件。我们现在有一些页面可以显示给我们两个域的访问者。

第 3 步 – 为每个域创建服务器块文件

现在我们有了想要提供的内容,我们需要创建服务器块来告诉 Nginx 如何做到这一点。

默认情况下,Nginx 包含一个名为的服务器块default,我们可以将其用作我们自己配置的模板。我们将从设计第一个域的服务器块开始,然后将其复制到我们的第二个域并进行必要的修改。

创建第一个服务器块文件

如上所述,我们将通过复制默认文件来创建我们的第一个服务器块配置文件:

  • sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

现在,使用sudo权限打开您在文本编辑器中创建的新文件

  • sudo nano /etc/nginx/sites-available/example.com

忽略注释行,该文件将类似于以下内容:

/etc/nginx/sites-available/example.com
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }
}

首先,我们需要查看 listen 指令。服务器上只有我们的一个服务器块可以default_server启用选项。如果server_name请求与任何可用的服务器块不匹配,这指定哪个块应该为请求提供服务。这在现实世界中不应该经常发生,因为访问者将通过您的域名访问您的网站。

您可以通过default_serverlisten指令中包含该选项来选择将您的站点之一指定为“默认” ,或者您可以启用默认服务器块,/var/www/html如果找不到请求的主机,它将为目录的内容提供服务

在本指南中,我们将保留默认服务器块以处理不匹配的请求,因此我们default_server将从这个和下一个服务器块中删除您可以选择将选项添加到对您有意义的服务器块中。

/etc/nginx/sites-available/example.com
server {
        listen 80;
        listen [::]:80;

        . . .
}

注意:您可以default_server通过键入以下内容来检查该选项是否仅在单个活动文件中启用:

  • grep -R default_server /etc/nginx/sites-enabled/

如果在多个文件中找到未注释的匹配项(显示在最左边的列中),Nginx 将抱怨配置无效。

接下来我们要调整的是文档根,由root指令指定将其指向您创建的站点的文档根目录:

/etc/nginx/sites-available/example.com
server {
        listen 80;
        listen [::]:80;

        root /var/www/example.com/html;

}

接下来,我们需要修改server_name以匹配我们第一个域的请求。我们还可以添加我们想要匹配的任何别名。我们将添加一个www.example.com别名来演示。

完成后,您的文件将如下所示:

/etc/nginx/sites-available/example.com
server {
        listen 80;
        listen [::]:80;

        root /var/www/example.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

这就是我们需要的基本配置。保存并关闭文件以退出。

创建第二个服务器块文件

现在我们有了初始服务器块配置,我们可以将其用作第二个文件的基础。复制它以创建一个新文件:

  • sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com

sudo在编辑器中使用权限打开新文件

  • sudo nano /etc/nginx/sites-available/test.com

同样,如果您已经在其他地方使用过此文件中default_serverlisten指令,请确保您没有使用该选项调整root指令以指向您的第二个域的文档根目录并调整server_name以匹配您的第二个站点的域名(确保包含任何别名)。

完成后,您的文件可能如下所示:

/etc/nginx/sites-available/test.com
server {
        listen 80;
        listen [::]:80;

        root /var/www/test.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name test.com www.test.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

完成后,保存并关闭文件。

第 4 步 — 启用服务器块并重新启动 Nginx

现在我们有了服务器块文件,我们需要启用它们。我们可以通过创建从这些文件到sites-enabled目录的符号链接来做到这一点,Nginx 在启动期间从中读取。

我们可以通过键入以下内容来创建这些链接:

  • sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  • sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/

这些文件现在链接到启用的目录中。我们现在启用了三个服务器块,它们被配置为根据它们的listen指令和server_name(您可以在此处阅读有关 Nginx 如何处理这些指令的更多信息):

  • example.com: 将响应请求example.comwww.example.com
  • test.com: 将响应请求test.comwww.test.com
  • default: 将响应端口 80 上与其他两个块不匹配的任何请求。

为了避免因添加其他服务器名称而可能出现的哈希桶内存问题,我们还将调整/etc/nginx/nginx.conf文件中的单个值现在打开文件:

  • sudo nano /etc/nginx/nginx.conf

在文件中,找到server_names_hash_bucket_size指令。删除#符号以取消注释该行:

/etc/nginx/nginx.conf
http {
    . . .

    server_names_hash_bucket_size 64;

    . . .
}

完成后保存并关闭文件。

接下来,测试以确保您的任何 Nginx 文件中没有语法错误:

  • sudo nginx -t

如果没有发现问题,请重新启动 Nginx 以启用您的更改:

  • sudo systemctl restart nginx

Nginx 现在应该为您的两个域名提供服务。

第 5 步 – 修改本地主机文件以进行测试(可选)

如果您没有使用您拥有的域名而是使用占位符值,您可以修改本地计算机的配置,让您临时测试您的 Nginx 服务器块配置。

这将不允许其他访问者正确查看您的站点,但它会让您能够独立访问每个站点并测试您的配置。这是通过拦截通常会转到 DNS 来解析域名的请求来实现的。相反,我们可以设置我们希望本地计算机在请求域名时访问的 IP 地址。

注意:确保在这些步骤中您是在本地计算机上操作,而不是在远程服务器上操作。您将需要具有 root 访问权限、是管理组的成员,或者能够编辑系统文件来执行此操作。

如果您在家中使用 Mac 或 Linux 计算机,则可以通过键入以下内容来编辑所需的文件:

  • sudo nano /etc/hosts

如果您使用的是 Windows,您可以在此处找到更改主机文件的说明

您需要知道服务器的公共 IP 地址以及要路由到服务器的域。假设我的服务器的公共 IP 地址是203.0.113.5,我将添加到我的文件中的行看起来像这样:

/etc/hosts
127.0.0.1   localhost
. . .

203.0.113.5 example.com www.example.com
203.0.113.5 test.com www.test.com

这将拦截对example.com和 的任何请求test.com并将它们发送到您的服务器,如果我们实际上不拥有我们正在使用的域,这就是我们想要的。

完成后保存并关闭文件。

第 6 步 — 测试您的结果

现在您已全部设置完毕,您应该测试您的服务器块是否正常运行。您可以通过访问 Web 浏览器中的域来做到这一点:

http://example.com

您应该会看到如下所示的页面:

Nginx 第一个服务器块

如果您访问您的第二个域名,您应该会看到一个略有不同的网站:

http://test.com

Nginx 第二个服务器块

如果这两个站点都工作,则您已经成功地使用 Nginx 配置了两个独立的服务器块。

此时,如果您hosts在本地计算机上调整了文件以进行测试,您可能希望删除添加的行。

如果您需要为面向公众的站点访问您的服务器的域名,您可能希望为您的每个站点购买一个域名。

结论

您现在应该能够为您希望从同一服务器托管的每个域创建服务器块。您可以创建的服务器块的数量没有任何实际限制,只要您的硬件可以处理流量即可。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁