提供:ZStack社区
本教程为《在Ubuntu 14.04上设置Nginx与LEMP》系列全四篇中的第三篇。
在使用Nginx Web服务器时,各server blocks(类似于Apache当中的虚拟主机)可被用于封装配置细节并立足于单一服务器实现多域名托管。
在今天的指南文章中,我们将共同探讨如何在Ubuntu 14.04服务器之上为Nginc配置server blocks。
我们将利用非root用户配合sudo权限完成本篇教程。如果大家还没有配置好的非root用户,则可以通过Ubuntu 14.04初始服务器设置指南中提供的四步教学完成创建。
大家还需要在自己的服务器上安装Nginx。如果大家希望在服务器上拥有完整的LEMP(即Linux、Nginx、MySQL以及PHP)堆栈,则可参照在Ubuntu 14.04中设置LEMP堆栈教程中的指导。当然,如果大家只需要安装Nginx,则可以通过以下命令实现安装:
sudo apt-get update
sudo apt-get install nginx
在满足了以上要求后,大家就可以继续按本教程的内容推进了。
出于演示的目的,我们会利用Nginx服务器设置两个域名,分别为example.com与test.com。
大家可以参阅如何利用DigitalOcean设置域名 一文了解具体设置过程。如果大家没有备用域名可以使用,则不妨暂时随便选定两个,我们会在之后了解如何配置本地计算机以进行配置测试。
在默认条件下,Nginx会在Ubuntu 14.04上直接提供一个server block。其配置文档保存在以下目录当中:
/usr/share/nginx/html
我们不会使用默认目录,因为选择/var/www目录能够让工作更为便捷。Ubuntu’s Nginx package does not use 的Nginx软件包不会将/var/www作为默认文件root目录,这是因为Debian策略对软件包使用/var/www的方式做出了限定。
由于我们只是用户而非软件包管理者,因此我们可以告知Nginx自己文件root目录的具体位置。具体来讲,我们希望将全部站点都保存在/var/www目录之下,并在其中再建立一个html目录以保存全部文件。
首先,我们需要创建各必要目录。我们可以利用-pflag命令要求mkdir创建任意必要的主目录,具体命令如下:
sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/test.com/html
现在我们已经完成了目录创建,接下来就是将其所有权移交至自己的普通用户。我们可以使用$USER环境变量以替代当前已经登录的用户账户。通过这种方式,我们就能够在不允许访客创建内容的同时,直接在这些目录中创建文件。
sudo chown -R $USER:$USER /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/test.com/html
如果大家没有修改过umask值,那么我们的Web root权限应该是正确的。但为了进行验证,我们可以输入以下命令:
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>
完成之后保存退出。
由于我们的第二个站点基本使用同样的文件,因此将上述文件直接复制到第二个文件root目录中即可:
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>
完成后保存退出。现在大家已经完成了页面构建,访客可以从中了解到其访问的是什么站点。
现在我们有了需要交付的内容,接下来需要真正创建server blocks以告诉Nginx如何实现内容交付。
默认情况下,Nginx中包含一个名为defauult的server block,我们可以将其作为具体配置的模板。我们首先设计自己的第一个域server block,随后将其复制到第二个域内并做出必要的修改。
如之前所提到,我们将通过复制默认文件以创建自己的第一个server block配置文件:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
现在以root权限在文件编辑器中打开这个刚刚创建完成的新文件:
sudo nano /etc/nginx/sites-available/example.com
忽略各注释行,文件的实际内容如下所示:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ =404;
}
}
首先,我们需要审视其监听指令。全部server blocks当中,只能有一个包含default_serverspecification。这意味着当server_name请求无法与任何可用sever blocks相匹配时,其将负责指定由哪个block响应该请求。
我们最终肯定要禁用默认server block配置的,所以我们可以将该default_sever选项添加到此server block或者另一个站点的server block当中。在本示例中,我直接在本server block上启用defaultserver选项,但大家也可以根据需要选择另一种作法。
在此之后,我们需要通过root指令调整文件root,并将其指向此前创建的站点文件root目录 :
root /var/www/example.com/html;
注意:每条Nginx声明必须由一个分号(;)结尾,所以如果发现了问题请在代码行中检查这项常见问题。
接下来,我们需要修改server_name以匹配指向第一个域的请求。我们还可以额外添加任意希望匹配的昵称。出于演示需要,我们在这里添加一条www.example.com昵称:
server_name example.com www.example.com;
完成之后,大家的文件内容应该如下所示:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /var/www/example.com/html;
index index.html index.htm;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}
这就是全部基础配置工作了。保存并退出文件编辑。
现在我们已经拥有了原始server block配置,大家可以将其作为基础创建第二个文件。直接复制以创建新文件:
sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com
在编辑器内以root权限打开该新文件:
sudo nano /etc/nginx/sites-available/test.com
在这个新文件中,我们需要再次查看其监听指令。如果大家在上个文件中将default_serveroption设定为启用状态,则需要在本文件中将其移除。另外,大家还需要调整ipv6only=on选项,因为其只能在每个地址/端口组合中被指定一次:
listen 80;
listen [::]:80;
调整该文件的root目录以指向第二个域的文件root目录:
root /var/www/test.com/html;
调查其中的server_name以匹配第二个域及任意昵称:
server_name test.com www.test.com;
完成上述变更后,现在大家的文件应该如下所示:
server {
listen 80;
listen [::]:80;
root /var/www/test.com/html;
index index.html index.htm;
server_name test.com www.test.com;
location / {
try_files $uri $uri/ =404;
}
}
完成之后,保存并退出。
现在大家已经完成了server blocks的创建工作,只需加以启用即可。
我们可以通过创建符号链接对接这些文件与站点目录的方式实现以上目标,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/
这些文件现在已经处于启用目录当中。不过我们作为模板的默认server block文件同样被启用,这可能会与我们文件中的default_server参数设定发生冲突。
我们可以直接移除对应符号链接以禁用该默认server block文件。其仍然可由站点目录进行引用,但不会在启动过程中被Nginx所读取:
sudo rm /etc/nginx/sites-enabled/default
我们还需要在默认Nginx配置文件中调整另一项设定。打开该文件并输入:
sudo nano /etc/nginx/nginx.conf
我们只需要取消其中一行注释。找到并移除以下注释行:
server_names_hash_bucket_size 64;
现在,我们已经能够重启Nginx并启用全部变更了。输入以下命令:
sudo service nginx restart
Nginx现在应该已经能够正确响应我们的两个域名了。
如果到这里大家仍在使用前面提到的替代性域名值(因为没有备用域名可用),则可修改自己的本地计算机配置以临时测试这套Nginx server block配置。
在这种情况下,其他访客将无法正确查看我们的站点,但我们自己却能够独立查看各个站点并测试其配置。从原理层面讲,这种作法相当于拦截了全部通常指向DNS以实现域名解析的请求。相反,我们可以为自己的本地计算机设置所需的IP地址,并将其作为域名指向位置。
大家需要确保在执行以下步骤过程中操作的是自己的本地计算机,而非VPS服务器。大家还需要进行root访问——可以选择作为管理群组中的成员,也可以编辑系统文件以实现访问能力。
如果大家在家中使用的是Mac或者Linux计算机,则可以通过以下命令编辑该文件:
sudo nano /etc/hosts
如果大家使用的是Windows计算机,则可在这里找到变更主机文件的对应指令。
大家需要自己服务器的公共IP地址以及希望路由至该服务器的域名。假定我们的服务器公共IP地址为111.111.111.111,那么我们则需要向文件中添加以下内容:
127.0.0.1 localhost
127.0.0.1 guest-desktop
111.111.111.111 example.com
111.111.111.111 test.com
如此一来,全部指向example.com与test.com的请求都将被拦截,并被转发至我们的服务器处,这样即使不具备对应的域名也没关系了。
完成后保存并退出。
现在大家已经完成了全部设置工作,接下来就要测试自己的server blocks能否正常运作了。大家可以在浏览器中直接访问其域名:
http://example.com
这时大家看到的页面应该如下所示:
如果大家要访问第二项域名,则会看到另一个站点:
http://test.com
如果两个站点皆能正常工作,那么利用Nginx配置两个独立server blocks的工作就已经成功完成了。
到这里,如果大家此前曾经调查对本地计算机上的主机文件以进行测试,那么需要将刚刚添加的行删除掉。
如果大家需要利用域名访问机制构建一套面向公众的网站,则可能需要为两个站点分别购买域名。关于这方面问题,建议大家参阅设置域名指向自有服务器。
大家现在应该已经能够立足于同一台服务器,创建多个指向不同域名的server blocks了。其实server blocks的实际创建数量并不存在硬性限制,因此只能各位的硬件能够处理相应流量,不妨大胆进行添加。
本文来源自DigitalOcean Community。英文原文:How To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu 14.04 LTS by Justin Ellingwood
翻译:diradw