使用Nginx Web服务器时,可以使用服务器块(类似于Apache中的虚拟主机)来封装配置详细信息,并从单个服务器托管多个域。
在本教程中,我们将讨论如何在Ubuntu 16.04服务器上配置Nginx中的服务器块。
在本教程中,我们将使用具有sudo
权限的的非root用户。
您还需要在服务器上安装Nginx。以下教程涵盖此过程:
没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
满足这些要求后,您可以继续阅读本教程。
出于演示目的,我们将使用我们的Nginx服务器设置两个域。我们将在本教程中使用的域名是example.com和test.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;
}
}
完成后,保存并关闭文件。
现在我们有了服务器块文件,我们需要启用它们。我们可以通过创建从这些文件到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.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
指令。删除#
符号以取消注释该行:
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.com
和test.com
拦截任何请求,并将它们发送到您的服务器,这就是我们想要如果我们不实际拥有,我们正在使用的域。
完成后保存并关闭文件。
现在您已经完成了所有设置,您应该测试您的服务器块是否正常运行。您可以通过访问Web浏览器中的域来执行此操作:
http://example.com
你应该看到一个如下所示的页面:
如果您访问第二个域名,您应该会看到一个略有不同的网站:
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 删除。