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

介绍

使用Nginx Web服务器时,可以使用服务器块(类似于Apache中的虚拟主机)来封装配置详细信息,并从单个服务器托管多个域。

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

准备

在本教程中,我们将使用具有sudo权限的的非root用户。

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

没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

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

示例配置

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

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

第一步:设置新文档根目录

默认情况下,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值,我们的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

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

sudo nano /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选项来选择将您的某个站点指定为“默认” ,或者您可以启用默认服务器块,如果找不到请求的主机,它将提供/var/www/html目录的内容。

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

server {
        listen 80;
        listen [::]:80;
​
        . . .
}

注意

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

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

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

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

server {
        listen 80;
        listen [::]:80;
​
        root /var/www/example.com/html;
​
}

接下来,我们需要修改server_name以匹配第一个域的请求。我们还可以添加我们想要匹配的任何别名。我们将添加一个www.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

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

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

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;
        }
}

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

第四步:启用服务器阻止并重新启动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指令。删除#符号以取消注释该行:

http {
    . . .
​
    server_names_hash_bucket_size 64;
​
    . . .
}

完成后保存并关闭文件。

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

sudo nginx -t

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

sudo systemctl restart nginx

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

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

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

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

注意

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

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

sudo nano /etc/hosts

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

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

127.0.0.1   localhost
. . .
​
203.0.113.5 example.com www.example.com
203.0.113.5 test.com www.test.com

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

完成后保存并关闭文件。

第六步:测试你的结果

现在您已经完成了所有设置,您应该测试您的服务器块是否正常运行。您可以通过访问Web浏览器中的域来执行此操作:

http://example.com

你应该看到一个如下所示的页面:

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

http://test.com

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

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

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

结论

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

想要了解更多关于设置Nginx服务器块(虚拟主机)的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu 16.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术之路

[个人翻译]Redis 集群教程(上)

   官方原文地址:https://redis.io/topics/cluster-tutorial    水平有限,如果您在阅读过程中发现有翻译的不合理的地...

2509
来自专栏Python中文社区

Linux进程监控工具Supervisor简易使用教程

專 欄 ❈ gw1770df,Python中文社区专栏作者,从事Python开发工作,全栈工程师。 博客: https://word.gw1770df.cc ...

3686
来自专栏linux系统运维

exportfs命令,NFS客户端问题,FTP介绍,使用vsftpd搭建ftp

/tmp/ 192.168.209.129/24(rw,sync,no_root_squash)

3643
来自专栏Python小屋

Python使用pyinstaller打包几个小技巧

1、进入命令提示符环境cmd,执行命令pip install pyinstaller安装扩展库pyinstaller。

2732
来自专栏码农二狗

windows下编译php及其扩展方式

1774
来自专栏性能与架构

Linux top命令的数据从哪儿来?

top命令是linux下非常重要的命令,帮助我们快速查看系统状态 那么top是如何获取系统各项状态指标的呢? 我们用strace命令跟踪一下top的执行 ...

4766
来自专栏杂烩

Redis linux下安装配置 原

make命令执行完成后,会在当前目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-sta...

712
来自专栏哈雷彗星撞地球

Node.js 撸第一个Web应用

使用Node.js 创建Web 应用与使用PHP/Java 语言创建Web应用略有不同。 使用PHP/Java 来编写后台代码时,需要Apache 或者 Ng...

1004
来自专栏逻辑熊猫带你玩Python

Linux | 26条Shell常用命令(面向小白)

语法格式:cd 目录, cd 回到家目录 cd ~回到家目录 cd -回到个目录 cd ..返回上层目录 cd !$返回上次([其他]命令)访问的目录

3482
来自专栏闵开慧

eclipse中部署tomcat

1 下载tomcat6.0,网址http://www.apache.org,这里使用zip文件,而不是exe文件。 2 解压下载文件,tomca...

31011

扫码关注云+社区

领取腾讯云代金券