如何在Ubuntu14.04LTS上设置Nginx服务器块(虚拟主机)

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

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

先决条件

在本教程中,我们将使用具有 sudo 权限的非 root 用户。 如果您没有配置这样的用户,您可以按照我们的 Ubuntu 14.04 初始服务器设置 指南中的步骤 1-4 进行配置。

您还需要在服务器上安装 Nginx。 如果您想在您的服务器上安装一个完整的 LEMP(Linux、Nginx、MySQL 和 PHP)堆栈,您可以按照我们关于 在 Ubuntu 14.04 中设置 LEMP 堆栈的指南进行操作。 如果您只需要 Nginx,您可以通过键入以下命令进行安装:

sudo apt-get update
sudo apt-get install nginx

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

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

您可以在此处找到有关 如何使用 DigitalOcean 设置域名的指南。 如果您没有两个备用域名可供使用,请暂时使用虚拟名称,稍后我们将向您展示如何配置本地计算机以测试您的配置。

第一步——设置新的文档根目录

默认情况下,Ubuntu 14.04 上的 Nginx 默认启用一个服务器块。 它被配置为从以下目录中提供文档:

/usr/share/nginx/html

我们不会使用默认值,因为使用 /var/www 目录中的东西更容易。 由于 Debian 关于使用 /var/www 的软件包的政策,Ubuntu 的 Nginx 软件包默认不使用 /var/www 作为其文档根目录。

由于我们是用户而不是包维护者,我们可以告诉 Nginx 这是我们希望文档根目录所在的位置。 具体来说,我们希望在 /var/www 目录中为每个站点创建一个目录,并且我们将在这些目录下有一个名为 html 的目录来保存我们的实际文件。

首先,我们需要创建必要的目录。 我们可以使用以下命令来做到这一点。 -p 标志告诉 mkdir 在此过程中创建任何必要的父目录:

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

现在您已经创建了目录,我们需要将所有权转移给我们的普通用户。 我们可以使用 $USER 环境变量来替换我们当前登录的用户帐户。 这将允许我们在此目录中创建文件,而不允许我们的访问者创建内容。

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

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

sudo chmod -R 755 /var/www

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

第二步——为每个站点创建示例页面

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

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

nano /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>

完成后保存并关闭文件。

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

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

现在,我们可以在编辑器中打开新文件并对其进行修改,使其引用我们的第二个域:

nano /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>

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

第三步——为每个域创建服务器块文件

现在我们有了希望提供的内容,我们需要实际创建服务器块来告诉 Nginx 如何执行此操作。

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

创建第一个服务器块文件

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

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

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

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

忽略注释行,文件将如下所示:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;

    server_name localhost;

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

首先,我们需要查看listen 指令。 只有我们的一个服务器块可以具有 default_server 规范。 如果请求的 server_name 与任何可用的服务器块不匹配,这将指定哪个块应为请求提供服务。

我们最终将禁用默认服务器块配置,因此我们可以将 default_server 选项放置在此服务器块或我们其他站点的服务器块中。 我将在此服务器块中启用 default_server 选项,但您可以选择最适合您情况的选项。

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

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

注意:每个 Nginx 语句 必须 以分号 (;) 结尾,因此如果遇到问题,请检查每一行。

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

server_name example.com www.example.com;

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

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

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

    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

在编辑器中以 root 权限打开新文件:

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

在这个新文件中,我们将不得不再次查看 listen 指令。 如果您在最后一个文件中启用了 default_server 选项,则必须在此文件中将其删除。 此外,您必须摆脱 ipv6only=on 选项,因为每个地址/端口组合只能指定一次:

listen 80;
listen [::]:80;

调整文档根指令以指向您的第二个域的文档根:

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

调整 server_name 以匹配您的第二个域和任何别名:

server_name test.com www.test.com;

通过以下更改,您的文件应如下所示:

server {
    listen 80;
    listen [::]:80;

    root /var/www/test.com/html;
    index index.html index.htm;

    server_name test.com www.test.com;

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

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

第四步——启用你的服务器块并重启 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/

这些文件现在位于启用的目录中。 但是,我们用作模板的默认服务器块文件当前也已启用,它将与我们设置了 default_server 参数的文件冲突。

我们可以通过简单地删除符号链接来禁用默认的服务器块文件。 在 sites-available 目录下仍然可以参考,但 Nginx 在启动时不会读取:

sudo rm /etc/nginx/sites-enabled/default

我们还需要在默认的 Nginx 配置文件中快速调整一项设置。 通过键入以下内容打开它:

sudo nano /etc/nginx/nginx.conf

我们只需要取消注释一行。 从中查找并删除评论:

server_names_hash_bucket_size 64;

现在,我们准备重新启动 Nginx 以启用您的更改。 您可以通过键入:

sudo service nginx restart

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

第五步——设置本地主机文件(可选)

如果您没有使用自己拥有的域名而是使用虚拟值,则可以修改本地计算机的配置,以允许您临时测试 Nginx 服务器块配置。

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

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

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

sudo nano /etc/hosts

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

您需要服务器的公共 IP 地址和要路由到服务器的域。 假设我的服务器的公共 IP 地址是 111.111.111.111,我将添加到文件中的行将如下所示:

127.0.0.1   localhost
127.0.0.1   guest-desktop
111.111.111.111 example.com
111.111.111.111 test.com

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

完成后保存并关闭文件。

第六步——测试你的结果

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

http://example.com

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

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

http://test.com

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

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

如果您需要对面向公众的站点的服务器进行域名访问,您可能需要为每个站点购买一个域名。 您可以在此处了解如何 将它们设置为指向您的服务器

结论

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