前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 16.04上设置Nginx服务器块(虚拟主机)

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

原创
作者头像
葡萄
修改2018-10-22 11:35:24
4.8K0
修改2018-10-22 11:35:24
举报

介绍

使用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在此过程中创建任何必要的父目录:

代码语言:javascript
复制
sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/test.com/html

现在我们有了目录,我们会将Web目录的所有权重新分配给普通用户帐户。这将让我们在没有sudo权限的情况下写信给他们。

注意

根据您的需要,您可能需要再次调整文件夹的权限或所有权,以允许对www-data用户进行某些访问。例如,动态网站通常需要这样做。具体权限和所有权要求完全取决于您的配置。遵循您正在使用的特定技术的建议。

我们可以使用$USER环境变量将所有权分配给我们当前登录的帐户(确保您没有作为root用户登录)。这将允许我们轻松地创建或编辑此目录中的内容:

代码语言:javascript
复制
sudo chown -R $USER:$USER /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/test.com/html

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

代码语言:javascript
复制
sudo chmod -R 755 /var/www

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

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

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

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

代码语言:javascript
复制
nano /var/www/example.com/html/index.html

在文件中,我们将创建一个非常基本的文件,指示我们当前访问的网站。它看起来像这样:

代码语言:javascript
复制
<html>
    <head>
        <title>Welcome to Example.com!</title>
    </head>
    <body>
        <h1>Success!  The example.com server block is working!</h1>
    </body>
</html>

完成后保存并关闭文件。

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

代码语言:javascript
复制
cp /var/www/example.com/html/index.html /var/www/test.com/html/

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

代码语言:javascript
复制
nano /var/www/test.com/html/index.html

修改它以便它引用我们的第二个域:

代码语言:javascript
复制
<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,我们可以将其用作我们自己配置的模板。我们将首先设计我们的第一个域的服务器块,然后我们将为第二个域复制并进行必要的修改。

创建第一个服务器块文件

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

代码语言:javascript
复制
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

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

代码语言:javascript
复制
sudo nano /etc/nginx/sites-available/example.com

忽略注释行,该文件将类似于:

代码语言:javascript
复制
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从此服务器块和下一个服务器块中删除它们。您可以选择将选项添加到对您有意义的服务器块中。

代码语言:javascript
复制
server {
        listen 80;
        listen [::]:80;
​
        . . .
}

注意

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

代码语言:javascript
复制
grep -R default_server /etc/nginx/sites-enabled/

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

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

代码语言:javascript
复制
server {
        listen 80;
        listen [::]:80;
​
        root /var/www/example.com/html;
​
}

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

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

代码语言:javascript
复制
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;
        }
}

这就是基本配置所需的全部内容。保存并关闭文件以退出。

创建第二个服务器块文件

现在我们有了初始服务器块配置,我们可以使用它作为第二个文件的基础。将其复制以创建新文件:

代码语言:javascript
复制
sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com

在编辑器中使用sudo权限打开新文件:

代码语言:javascript
复制
sudo nano /etc/nginx/sites-available/test.com

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

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

代码语言:javascript
复制
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在启动时从中读取该目录。

我们可以输入以下内容来创建这些链:

代码语言:javascript
复制
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文件中的单个值。立即打开文件:

代码语言:javascript
复制
sudo nano /etc/nginx/nginx.conf

在文件中,找到server_names_hash_bucket_size指令。删除#符号以取消注释该行:

代码语言:javascript
复制
http {
    . . .
​
    server_names_hash_bucket_size 64;
​
    . . .
}

完成后保存并关闭文件。

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

代码语言:javascript
复制
sudo nginx -t

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

代码语言:javascript
复制
sudo systemctl restart nginx

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

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

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

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

注意

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

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

代码语言:javascript
复制
sudo nano /etc/hosts

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

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

代码语言:javascript
复制
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浏览器中的域来执行此操作:

代码语言:javascript
复制
http://example.com

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

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

代码语言:javascript
复制
http://test.com

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

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

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

结论

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

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


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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 示例配置
  • 第一步:设置新文档根目录
  • 第二步:为每个站点创建示例页面
  • 第三步:为每个域创建服务器块文件
    • 创建第一个服务器块文件
      • 创建第二个服务器块文件
      • 第四步:启用服务器阻止并重新启动Nginx
      • 第五步:修改本地主机文件以进行测试(可选)
      • 第六步:测试你的结果
      • 结论
      相关产品与服务
      云数据库 SQL Server
      腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档