专栏首页云计算教程系列如何在Ubuntu 16.04上设置Nginx服务器块(虚拟主机)
原创

如何在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 条评论
登录 后参与评论

相关文章

  • 如何使用Ubuntu 16.04上的osquery监视系统安全性

    osquery是一个安全开源工具,它采用操作系统并将其转换为一个巨大的数据库,使用可以使用类似SQL的语句进行查询的表。通过这些查询,您可以监控文件完整性,检查...

    葡萄
  • 如何在CentOS中自定义Nginx服务器的名称

    本教程可帮助您自定义主机上的服务器名称。通常,出于安全考虑,各公司会修改服务器名称。自定义nginx服务器的名称需要修改源代码。

    葡萄
  • 如何在Ubuntu 14.04上使用Pydio托管文件共享服务器

    随着云的采用增加,越来越多的数据被远程存储。从音乐到图片再到个人文档,很多人都将文件上传到他们不管理的服务器上。如果您希望将文件保存在您控制的服务器上,则可以使...

    葡萄
  • 对不起,看完这篇HTTP,真的可以吊打面试官

    在 HTTP 中,内容协商是一种用于在同一 URL 上提供资源的不同表示形式的机制。内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最...

    黄泽杰
  • 如何在腾讯云上快速搭建Web服务器

    Web服务器由于它的安全,方便,简洁等优点,已经成为目前使用规模最广的服务器。个人或者企业搭建网站是万万不能离开它的,然而搭建Web服务器却对于一部分非专业人士...

    主机优惠教程
  • 云服务器-腾讯云服务器

    云服务器是什么?介绍云服务器的性能及云服务器的购买流程。云服务器是腾讯云研发的新一代云服务器,所以又称为腾讯云服务器。腾讯云服务器可以随时升高或降低配置,当业务...

    用户1361591
  • CentOS7.2与Nginx配置虚拟主机

    centos安装nginx的文章在前期有发过。。。这里就不再详解,不懂可以查找资料的

    php007
  • 云服务器-腾讯云服务器

    云服务器是什么?介绍云服务器的性能及云服务器的购买流程。云服务器是腾讯云研发的新一代云服务器,所以又称为腾讯云服务器。腾讯云服务器可以随时升高或降低配置,当业务...

    赤孺
  • SQL语句执行原理清空缓存的方法

    文章转载:原文地址 原理: 第一步:应用程序把查询SQL语句发给服务器端执行。 我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发...

    Albert陈凯
  • Linux从入门到精通系列之NFS

       网络文件系统(NFS,Network File System)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,...

    DevinGeng

扫码关注云+社区

领取腾讯云代金券