如何在 Ubuntu 16.04 上配置 Nginx 虚拟主机(托管多个网站)

我们经常需要在同一台服务器上,部署多个网站。我们之前讲过手动在Ubuntu 18.04上配置Apache虚拟主机,那么如何在 Ubuntu 16.04 上配置 Nginx Web 服务器块(类似于 Apache 中的虚拟主机),以在一台服务器上托管多个域名网站呢?

如何在 Ubuntu 16.04 上配置 Nginx 虚拟主机(托管多个网站)
如何在 Ubuntu 16.04 上配置 Nginx 虚拟主机(托管多个网站)

示例配置

为了演示方便,本教程中我们将使用 Nginx 服务器配置两个域名分别为 example.comtest.com

步骤 1 — 设置网站根目录

默认情况下,Ubuntu 16.04 上的 Nginx 启用了一个服务器块(虚拟主机)。它被配置在 /var/www/html 目录下。

如果只在一台服务器上部署单个站点,我们可以使用默认的 Nginx 配置,但如果我们要配置多个站点,我们就需要设置额外的网站目录。本文的示例中,我们的所有域名都不使用默认的网站目录 /var/www/html,而是为每个域名配置独立的网站目录。

我们将在 /var/www 目录下,为每个站点创建一个网站目录。

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

现在我们为每个测试域名创建了单独的网站目录,我们需要把每个 Web 目录的所有权分配给 Nginx 用户。

注意:我们可以根据需要再次调整文件夹的权限或所有权,以允许 www-data 用户获得访问授权。

我们可以使用 $USER 环境变量将所有权分配给我们当前登录的帐户。这样,我们就能够创建或编辑此目录中的内容了:

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

到目前为止,每个网站目录的权限应该已经设置完成,但我们可以通过输入以下命令来进一步设置权限:

sudo chmod -R 755 /var/www

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

第 2 步 – 为每个站点创建示例页面

现在,我们为每个站点创建一个测试页面。

在第一个域名根目录下,创建一个名为 index.html 的文件:

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

在该文件中,我们填充一些基本的 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 退出。

为了方便,我们直接将刚创建的 Html 文件复制到另一个网站目录下:

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 的配置文件,我们将该文件的配置内容用作新建配置文件的模板。

创建第一个服务器配置文件

如上所述,我们通过复制 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 没有匹配到任何可用的配置文件时,指定使用默认的配置文件。

我们可以从新建的两个配置文件选择一个,在 listen 指令中添加 default_server,或者可以使用 default 配置文件,如果找不到请求的主机,它将吧 /var/www/html目录作为默认访问路径。

在本文中,我们将保留 default 配置文件以处理不匹配的请求,因此我们从新建的两个网站配置文件中删除 default_server 选项。

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

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

        . . .
}

接下来,我们要调整网站的根目录,文件中 root 指令指定指向创建的站点的网站目录:

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

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

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

}

接下来,我们需要修改 server_name 以匹配对应的域名和别名。

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

/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 nano /etc/nginx/sites-available/test.com

同样,设置好网站对应的根目录和别名。

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

/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 请求进行响应:

  • 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

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

如果我们没有可使用的域名,只是在本地计算机进行配置测试,我们可以设置本地计算机在请求域名时访问的 IP 地址。这样本地可以访问这两个域名,但是其他用户则无法访问。

编辑 /etc/hosts 文件:

sudo nano /etc/hosts

假设服务器的公共 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 步 — 测试您的结果

现在已全部设置完毕,我们通过浏览器访问对应的域名:

http://example.com

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

Nginx 第一个服务器块

访问第二个域名,如下所示:

http://test.com
Nginx 第二个服务器块

如果访问正常,说明我们的配置是没有问题的。不要忘记删除在第五步中对 hosts 进行的测试配置。

原创文章,作者:牛奇网,如若转载,请注明出处:https://www.niuqi360.com/linux/how-to-set-up-nginx-virtual-hosts-on-ubuntu/

发表评论

登录后才能评论