介绍
使用 Nginx Web 服务器时,server blocks(类似于 Apache 中的虚拟主机)可用于封装配置细节并在单个服务器上托管多个域。
在本指南中,我们将讨论如何在 Ubuntu 16.04 服务器上的 Nginx 中配置服务器块。
先决条件
在本教程中,我们将使用具有 sudo
权限的非 root 用户。 如果您没有配置这样的用户,您可以按照我们的 Ubuntu 16.04 初始服务器设置 指南创建一个。
您还需要在服务器上安装 Nginx。 以下指南涵盖了此过程:
- 如何在 Ubuntu 16.04 上安装 Nginx:使用本指南自行设置 Nginx。
- 如何在 Ubuntu 16.04 中安装 Linux、Nginx、MySQL、PHP(LEMP 堆栈):如果您将 Nginx 与 MySQL 和 PHP 结合使用,请使用本指南。
满足这些要求后,您可以继续阅读本指南。
示例配置
出于演示目的,我们将使用 Nginx 服务器设置两个域。 我们将在本指南中使用的域名是 example.com 和 test.com。
注意:有关使用DigitalOcean设置域的更多信息,请参阅我们的域和DNS产品文档。
如果您没有两个备用域名可供使用,请暂时使用占位符名称,稍后我们将向您展示如何配置本地计算机以测试您的配置。
第 1 步 — 设置新的文档根目录
默认情况下,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
我们的目录结构现在已经配置好了,我们可以继续了。
第 2 步 — 为每个站点创建示例页面
现在我们已经设置了目录结构,让我们为每个站点创建一个默认页面,以便我们可以显示一些内容。
在您的第一个域中创建一个 index.html
文件:
nano /var/www/example.com/html/index.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
退出。
由于我们第二个站点的文件基本上是相同的,我们可以将它复制到我们的第二个文档根目录,如下所示:
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
的服务器块,我们可以将其用作我们自己的配置的模板。 我们将从设计第一个域的服务器块开始,然后将其复制到第二个域并进行必要的修改。
创建第一个服务器块文件
如上所述,我们将通过复制默认文件来创建我们的第一个服务器块配置文件:
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
选项来选择将您的站点之一指定为“默认”,或者您可以启用默认服务器块,这将提供如果找不到请求的主机,则返回 /var/www/html
目录。
在本指南中,我们将保留默认服务器块以服务不匹配的请求,因此我们将从这个和下一个服务器块中删除 default_server
。 您可以选择将选项添加到对您有意义的任何服务器块。
/etc/nginx/sites-available/example.com
server { listen 80; listen [::]:80; . . . }
注意: 您可以通过键入以下命令检查 default_server
选项是否仅在单个活动文件中启用:
grep -R default_server /etc/nginx/sites-enabled/
如果在多个文件中发现未注释的匹配项(显示在最左边的列中),Nginx 将抱怨配置无效。
接下来我们要调整的是文档根目录,由 root
指令指定。 将其指向您创建的站点的文档根目录:
/etc/nginx/sites-available/example.com
server { listen 80; listen [::]:80; root /var/www/example.com/html; }
接下来,我们需要修改 server_name
以匹配我们第一个域的请求。 我们还可以添加任何我们想要匹配的别名。 我们将添加一个 www.example.com
别名来演示。
完成后,您的文件将如下所示:
/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
权限打开新文件:
sudo nano /etc/nginx/sites-available/test.com
同样,如果您已经在其他地方使用过,请确保不要在此文件中使用 listen
指令的 default_server
选项。 调整 root
指令以指向您的第二个域的文档根目录,并调整 server_name
以匹配您的第二个站点的域名(确保包含任何别名)。
完成后,您的文件可能如下所示:
/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
进行响应(您可以阅读更多关于 Nginx 如何处理这些指令 here) :
example.com
:将响应对example.com
和www.example.com
的请求test.com
:将响应对test.com
和www.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
Nginx 现在应该为您的两个域名提供服务。
第 5 步 — 修改本地主机文件以进行测试(可选)
如果您没有使用您拥有的域名而是使用占位符值,您可以修改本地计算机的配置,让您临时测试您的 Nginx 服务器块配置。
这将不允许其他访问者正确查看您的站点,但它将使您能够独立访问每个站点并测试您的配置。 这通过拦截通常会去 DNS 解析域名的请求来工作。 相反,我们可以设置我们希望本地计算机在请求域名时访问的 IP 地址。
注意: 确保在这些步骤中您是在本地计算机上操作,而不是在远程服务器上操作。 您将需要具有 root 访问权限、成为管理组的成员,或者能够编辑系统文件来执行此操作。
如果您在家中使用 Mac 或 Linux 计算机,则可以通过键入以下内容来编辑所需的文件:
sudo nano /etc/hosts
如果您使用的是 Windows,您可以 在此处找到更改主机文件 的说明。
您需要知道服务器的公共 IP 地址以及要路由到服务器的域。 假设我的服务器的公共 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 步——测试你的结果
现在您已经全部设置好,您应该测试您的服务器块是否正常运行。 您可以通过访问 Web 浏览器中的域来做到这一点:
http://example.com
您应该会看到如下所示的页面:
如果您访问您的第二个域名,您应该会看到一个略有不同的站点:
http://test.com
如果这两个站点都可以正常工作,那么您已经成功地使用 Nginx 配置了两个独立的服务器块。
此时,如果您调整了本地计算机上的 hosts
文件以进行测试,您可能需要删除添加的行。
如果您需要对面向公众的站点的服务器进行域名访问,您可能需要为每个站点购买一个域名。
结论
您现在应该能够为您希望从同一服务器托管的每个域创建服务器块。 只要您的硬件可以处理流量,您可以创建的服务器块的数量没有任何实际限制。