介绍
当使用Nginx的网络服务器, 服务器模块 (类似于Apache的虚拟主机),可用于封装配置的详细信息,并举办多个域关闭一台服务器。
在本指南中,我们将讨论如何在Ubuntu 16.04服务器上配置Nginx中的服务器块。
先决条件
我们将要使用一个非root用户sudo
权限在本教程中。 如果你没有一个用户这样的配置,你可以按照我们创建一个的Ubuntu 16.04服务器初始设置指南。
你还需要在你的服务器上安装Nginx。 以下指南介绍了此过程:
- 如何在Ubuntu 16.04安装Nginx的 :使用本指南来设置Nginx的自身。
- 如何在Ubuntu 16.04安装Linux,Nginx的,MySQL和PHP(LEMP) :如果你将与MySQL和PHP结合使用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
我们的Web根权限应该是已经是正确的,如果你没有修改过umask
价值,但我们可以通过输入确认:
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;
}
}
首先,我们需要看听指令, 只有在服务器上我们的服务器块可以有default_server
启用选项。这将指定块应该服务的请求,如果server_name
要求不匹配任何可用的服务器块。 在现实世界的情况下,这不会发生非常频繁,因为访问者将通过您的域名访问您的网站。
您可以选择通过包括指定的网站为“默认”之一default_server
在选项listen
指令,也可以保留默认服务器块启用,这将成为该内容/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
同样,请确保您不要使用default_server
选项,在listen
指令,在这个文件中,如果你已经在其他地方使用它。 调整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
(你可以阅读更多关于Nginx的如何处理这些指令这里 ):
-
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地址。
如果您在家中的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
,并将它们发送到您的服务器,这就是我们要,如果我们不实际拥有我们所使用的域。
保存并在完成后关闭文件。
第六步:测试你的结果
现在您已经完成设置,您应该测试您的服务器块是否正常工作。 您可以通过访问您的网络浏览器中的域:
http://example.com
您应该看到如下所示的页面:
如果您访问您的第二个域名,您应该看到一个稍微不同的网站:
http://test.com
如果这两个站点都工作,您已成功配置了两个独立的服务器块与Nginx。
在这一点上,如果你调整你的hosts
,以测试你的本地计算机上的文件,你可能会想删除您添加的行。
如果您需要为面向公众的网站访问您的服务器的域名,您可能需要为每个网站购买域名。 你可以学习如何将其设置为指向您的服务器在这里。
结论
您现在应该能够为您希望从同一服务器托管的每个域创建服务器块。 对您可以创建的服务器块数量没有任何实际限制,只要您的硬件可以处理流量。