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

介绍

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

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

前提条件

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

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

当您满足这些要求后,您可以继续使用此指南。

配置示例

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

<$>[info] **注:**有关与DigitalOcean建立域的更多信息,请参阅我们的 域和DNS产品文档

如果您没有两个备用域名来玩,请现在使用位置持有人名称,我们稍后将向您展示如何配置本地计算机来测试您的配置。

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

默认情况下,Ubuntu 16.04 上的 Nginx 有一个服务器块启用. 它配置为从 `/var/www/html’ 中的目录中服务文档。

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

我们将为每个网站创建一个/var/www中的目录结构,实际的网页内容将被放置在这些特定网站目录中的html目录中,这为我们提供了一些额外的灵活性,如果需要,将与我们的网站相关的其他目录创建为html目录的兄弟。

我们需要为每一个网站创建这些目录,而p旗表示mkdir,以便在途中创建任何必要的家长目录:

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

现在我们有我们的目录,我们将重新分配所有权的网页目录到我们的正常用户帐户,这将允许我们写给他们没有sudo

<$>[注] **注:**根据您的需求,您可能需要重新调整文件夹的权限或所有权,以允许某些访问到www-data用户。例如,动态网站通常需要这样做。特定的权限和所有权要求完全取决于您的配置。

我们可以使用$USER环境变量将所有权分配给我们目前已登录的帐户(请确保您没有登录为 root)。

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

如果您尚未更改您的mask值,我们的 Web 根的权限应该已经正确,但我们可以通过键入来确保:

1sudo chmod -R 755 /var/www

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

步骤 2:为每个网站创建样本页面

现在我们已经建立了目录结构,让我们为每个网站创建一个默认页面,以便我们有东西可显示。

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

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

在文件中,我们将创建一个非常基本的文件,表明我们目前正在访问的网站。

1[label /var/www/example.com/html/index.html]
2<html>
3    <head>
4        <title>Welcome to Example.com!</title>
5    </head>
6    <body>
7        <h1>Success! The example.com server block is working!</h1>
8    </body>
9</html>

完成后保存并关闭文件. 要在nano中做到这一点,请按CTRL+o来写出文件,然后按CTRL+x来退出文件。

由于我们第二个网站的文件基本上将是相同的,我们可以将其复制到我们的第二个文档根如下:

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

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

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

修改它,以便它指向我们的第二个域:

1[label /var/www/test.com/html/index.html]
2<html>
3    <head>
4        <title>Welcome to Test.com!</title>
5    </head>
6    <body>
7        <h1>Success!  The test.com server block is working!</h1>
8    </body>
9</html>

保存并关闭此文件,当您完成时. 我们现在有几个页面向我们两个域的访问者显示。

步骤 3:为每个域创建服务器块文件

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

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

创建第一个服务器块文件

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

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

现在,打开您在文本编辑器中创建的新文件,具有sudo特权:

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

忽略了评论的行,文件将看起来像这样:

 1[label /etc/nginx/sites-available/example.com]
 2server {
 3        listen 80 default_server;
 4        listen [::]:80 default_server;
 5
 6        root /var/www/html;
 7        index index.html index.htm index.nginx-debian.html;
 8
 9        server_name _;
10
11        location / {
12                try_files $uri $uri/ =404;
13        }
14}

首先,我们需要看看听取指令。 ** 服务器上的服务器块中只有一个可以启用默认_服务器选项。 ** 这指定了如果所请求的服务器_名称不匹配任何可用的服务器块,该块应该提供请求。

您可以选择将您的网站之一指定为默认通过在倾听指令中包含默认_服务器选项,或者您可以让默认服务器封锁启用,如果无法找到所请求的主机,它将为/var/www/html目录的内容提供服务。

在本指南中,我们将放置默认服务器块,以服务不匹配的请求,所以我们将从这个和下一个服务器块中删除default_server

1[label /etc/nginx/sites-available/example.com]
2server {
3        listen 80;
4        listen [::]:80;
5
6        . . .
7}

<$>[注] ** 注意:** 您可以通过键入以下方式,确保在单个活跃文件中只启用默认_服务器选项:

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

如果在多个文件中找到未评论的匹配(显示在最左列), Nginx 会抱怨无效的配置

接下来我们将不得不调整的是指令所指定的文档根,指向您创建的网站的文档根:

1[label /etc/nginx/sites-available/example.com]
2server {
3        listen 80;
4        listen [::]:80;
5
6        root /var/www/example.com/html;
7
8}

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

当你完成时,你的文件将看起来像这样:

 1[label /etc/nginx/sites-available/example.com]
 2server {
 3        listen 80;
 4        listen [::]:80;
 5
 6        root /var/www/example.com/html;
 7        index index.html index.htm index.nginx-debian.html;
 8
 9        server_name example.com www.example.com;
10
11        location / {
12                try_files $uri $uri/ =404;
13        }
14}

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

创建第二个服务器块文件

现在我们有我们的初始服务器封锁配置,我们可以使用它作为我们的第二个文件的基础。

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

打开你的编辑器中的sudo特权的新文件:

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

再次,请确保您没有在此文件中使用指令的默认_服务器选项,如果您已经在其他地方使用了该指令。

当你完成时,你的文件可能会看起来像这样的东西:

 1[label /etc/nginx/sites-available/test.com]
 2server {
 3        listen 80;
 4        listen [::]:80;
 5
 6        root /var/www/test.com/html;
 7        index index.html index.htm index.nginx-debian.html;
 8
 9        server_name test.com www.test.com;
10
11        location / {
12                try_files $uri $uri/ =404;
13        }
14}

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

步骤 4 – 启用服务器封锁并重新启动 Nginx

现在我们有我们的服务器封锁文件,我们需要启用它们,我们可以通过从这些文件创建符号链接到网站启用目录, Nginx 在启动过程中读取。

我们可以通过键入创建这些链接:

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

我们现在有三个服务器块启用,这些服务器被配置为根据其倾听指令和服务器名称响应(您可以阅读有关 Nginx 如何处理这些指令的更多信息(LINK0)):

  • example.com: 将响应对 example.comwww.example.com 的请求* test.com: 将响应对 test.comwww.test.com 的请求* 默认: 将响应在端口 80 上不匹配其他两个块的任何请求

为了避免可能导致添加额外的服务器名称的哈希库存问题,我们还将调整我们的 /etc/nginx/nginx.conf 文件中的单个值。

1sudo nano /etc/nginx/nginx.conf

在檔案中,尋找 server_names_hash_bucket_size 指令. 移除 # 符號,以解釋行:

1[label /etc/nginx/nginx.conf]
2http {
3    . . .
4
5    server_names_hash_bucket_size 64;
6
7    . . .
8}

保存并关闭文件,当你完成。

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

1sudo nginx -t

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

1sudo systemctl restart nginx

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

步骤 5 — 修改本地主机文件进行测试(可选)

如果您尚未使用您所拥有的域名,而是使用了位数值,您可以更改本地计算机的配置,以允许您暂时测试您的 Nginx 服务器封锁配置。

这不会允许其他访问者正确查看您的网站,但它会让你能够独立访问每个网站并测试您的配置。这通过拦截通常会去DNS解决域名的请求来工作。

<$>[注] 注: 确保您在这些步骤中在本地计算机上运行,而不是远程服务器。

如果您在家用Mac或Linux计算机上,您可以通过键入编辑所需的文件:

1sudo nano /etc/hosts

如果您在 Windows 上,您可以在这里找到 找到修改您的主机文件的说明

假设我的服务器的公共IP地址是203.0.113.5,我将添加到我的文件的行将看起来像这样:

1[label /etc/hosts]
2127.0.0.1 localhost
3. . .
4
5203.0.113.5 example.com www.example.com
6203.0.113.5 test.com www.test.com

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

保存并关闭文件,当你完成。

步骤6:测试你的结果

现在你已经设置了,你应该测试你的服务器块是否正常工作. 你可以通过访问你的网页浏览器的域名来做到这一点:

1http://example.com

你应该看到一个看起来像这样的页面:

Nginx first server block

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

1http://test.com

Nginx second server block

如果这两个网站都起作用,那么您已经成功配置了两个独立的服务器块,使用 Nginx。

在此时刻,如果您在本地计算机上调整了主机文件以进行测试,您可能会想要删除所添加的行。

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

结论

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

Published At
Categories with 技术
comments powered by Disqus