介绍
在使用 Nginx Web 服务器时,可以使用服务器块
(类似于 Apache 中的虚拟主机)来封装配置细节,并在单个服务器中托管多个域。
在本指南中,我们将讨论如何在 Ubuntu 14.04 服务器上配置 Nginx 中的服务器块。
前提条件
在本教程中,我们将使用具有sudo
特权的非根用户. 如果您没有配置这样的用户,您可以按照我们 Ubuntu 14.04 初始服务器设置指南中的步骤 1-4 创建一个。
如果你想在你的服务器上安装一个完整的LEMP(Linux, Nginx,MySQL和PHP)堆栈,你可以按照我们的指南在Ubuntu 14.04中设置LEMP堆栈(https://www.digitalocean.com/community/articles/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04)。
1sudo apt-get update
2sudo apt-get install nginx
当您满足这些要求后,您可以继续使用此指南。
为了演示目的,我们将使用我们的 Nginx 服务器设置两个域名,我们将在本指南中使用的域名是example.com
和test.com
。
如果你没有两个备用域名来玩,请现在使用愚蠢的名称,我们将在稍后向你展示如何配置本地计算机来测试你的配置。
步骤一:设置新的文档根目录
默认情况下,Ubuntu 14.04 上的 Nginx 有一个服务器块默认启用,它配置为从目录中服务的文档:
1/usr/share/nginx/html
我们不会使用默认值,因为在/var/www
目录中工作更容易。Ubuntu的Nginx包不会默认使用/var/www
作为其文档根,因为Debian关于使用 /var/www的包的政策(http://lintian.debian.org/tags/dir-or-file-in-var-www.html)。
由于我们是用户,而不是包维护者,我们可以告诉 Nginx,这就是我们想要我们的文档根的地方。
首先,我们需要创建必要的目录,我们可以用以下命令做到这一点,p
旗说mkdir
,以便在途中创建任何必要的家长目录:
1sudo mkdir -p /var/www/example.com/html
2sudo mkdir -p /var/www/test.com/html
现在你已经创建了你的目录,我们需要将所有权转移给我们的常规用户。我们可以使用$USER
环境变量来取代我们目前登录的用户帐户。
1sudo chown -R $USER:$USER /var/www/example.com/html
2sudo chown -R $USER:$USER /var/www/test.com/html
如果您尚未更改您的mask
值,我们的 Web 根的权限应该已经正确,但我们可以通过键入来确保:
1sudo chmod -R 755 /var/www
我们的目录结构现在已配置,我们可以继续。
步骤二:为每个网站创建示例页
现在我们已经建立了目录结构,让我们为每个网站创建一个默认页面,以便我们有东西可显示。
在你的第一个域中创建一个 index.html
文件:
1nano /var/www/example.com/html/index.html
在文件中,我们将创建一个非常基本的文件,表明我们目前正在访问的网站。
1<html>
2 <head>
3 <title>Welcome to Example.com!</title>
4 </head>
5 <body>
6 <h1>Success! The example.com server block is working!</h1>
7 </body>
8</html>
保存并关闭文件,当你完成。
由于我们第二个网站的文件基本上将是相同的,我们可以将其复制到我们的第二个文档根如下:
1cp /var/www/example.com/html/index.html /var/www/test.com/html/
现在,我们可以在我们的编辑器中打开新文件并修改它,以便它指向我们的第二个域:
1nano /var/www/test.com/html/index.html
1<html>
2 <head>
3 <title>Welcome to Test.com!</title>
4 </head>
5 <body>
6 <h1>Success! The test.com server block is working!</h1>
7 </body>
8</html>
当你完成时,保存并关闭此文件. 你现在有几个页面向我们两个域的访问者显示。
步骤三:为每个域创建服务器封锁文件
现在我们有我们想要服务的内容,我们需要实际上创建服务器块,这将告诉Nginx如何做到这一点。
默认情况下, Nginx 包含一个名为默认
的服务器块,我们可以使用它作为我们自己的配置的模板,我们将首先设计我们第一个域的服务器块,然后将其复制到我们的第二个域,并进行必要的修改。
创建第一个服务器块文件
如上所述,我们将通过复制默认文件来创建我们的第一个服务器块配置文件:
1sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
现在,打开您在 root 特权的文本编辑器中创建的新文件:
1sudo nano /etc/nginx/sites-available/example.com
忽略了评论的行,文件将看起来像这样:
1server {
2 listen 80 default_server;
3 listen [::]:80 default_server ipv6only=on;
4
5 root /usr/share/nginx/html;
6 index index.html index.htm;
7
8 server_name localhost;
9
10 location / {
11 try_files $uri $uri/ =404;
12 }
13}
首先,我们需要看看听取指令. 我们的服务器块中只有一个可以具有default_server
规格. 这指定了如果所请求的server_name
不匹配任何可用的服务器块,该块应该为请求服务。
我们最终将禁用默认服务器封锁配置,所以我们可以将default_server
选项放置在这个服务器封锁中或在我们其他网站的封锁中。
接下来我们将不得不调整的是根
指令所指定的文档根,指向您创建的网站的文档根:
1root /var/www/example.com/html;
注:每个 Nginx 语句 must 都以半列(;)结束,因此如果遇到问题,请检查每个行。
接下来,我们要修改server_name
,以匹配我们第一个域的请求,我们还可以添加我们想要匹配的任何副名称,我们会添加一个www.example.com
副名称来展示:
1server_name example.com www.example.com;
当你完成时,你的文件将看起来像这样:
1server {
2 listen 80 default_server;
3 listen [::]:80 default_server ipv6only=on;
4
5 root /var/www/example.com/html;
6 index index.html index.htm;
7
8 server_name example.com www.example.com;
9
10 location / {
11 try_files $uri $uri/ =404;
12 }
13}
这就是我们需要的基本配置。保存并关闭文件以退出。
创建第二个服务器块文件
现在我们有我们的初始服务器封锁配置,我们可以使用它作为我们的第二个文件的基础。
1sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com
在您的编辑器中打开新的 root 特权文件:
1sudo nano /etc/nginx/sites-available/test.com
在这个新文件中,我们将不得不再次查看倾听
指令. 如果您在最后一个文件中打开了默认_服务器
选项,则必须在这个文件中删除它。
1listen 80;
2listen [::]:80;
调整文档根指令,以指向您第二个域的文档根:
1root /var/www/test.com/html;
调整server_name
,以匹配您的第二个域和任何副名称:
1server_name test.com www.test.com;
您的檔案應該看起來像這樣,有這些變化:
1server {
2 listen 80;
3 listen [::]:80;
4
5 root /var/www/test.com/html;
6 index index.html index.htm;
7
8 server_name test.com www.test.com;
9
10 location / {
11 try_files $uri $uri/ =404;
12 }
13}
完成后,保存并关闭文件。
步骤四:启用服务器封锁并重新启动 Nginx
现在你已经创建了你的服务器块,我们需要启用它们。
我们可以通过从这些文件创建符号链接到网站启用
目录, Nginx 在启动过程中读取。
我们可以通过键入创建这些链接:
1sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
2sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/
然而,我们作为模板使用的默认服务器封锁文件目前也已启用,并且将与我们具有 default_server
参数集的文件冲突。
我们可以通过简单地删除符号链接来禁用默认服务器封锁文件,它仍然可以在可用网站
目录中提供参考,但在启动时不会被 Nginx 读取:
1sudo rm /etc/nginx/sites-enabled/default
我们还需要在默认的 Nginx 配置文件中快速调整一个设置。
1sudo nano /etc/nginx/nginx.conf
我们只需要不评论一行. 查找并删除此评论:
1server_names_hash_bucket_size 64;
现在,我们已经准备好重新启动 Nginx 以启用您的更改,您可以通过键入:
1sudo service nginx restart
Nginx现在应该为您的两个域名提供服务。
步骤五:设置本地主机文件(可选)
如果您尚未使用您所拥有的域名,而是使用了虚假值,则可以更改本地计算机的配置,以允许您暂时测试您的 Nginx 服务器封锁配置。
这将不允许其他访问者正确查看您的网站,但它会给你独立访问每个网站并测试您的配置的能力。这基本上通过拦截请求,通常会去DNS解决域名。
在这些步骤中,请确保您在本地计算机上运行,而不是您的 VPS 服务器. 您需要 root 访问,成为管理组成员,或以其他方式编辑系统文件才能做到这一点。
如果您在家用Mac或Linux计算机上,您可以通过键入编辑所需的文件:
1sudo nano /etc/hosts
如果您在 Windows 上,您可以在这里找到 找到修改您的主机文件的说明。
假设我的服务器的公共IP地址是111.111.111.111
,我将添加到我的文件的行将看起来像这样:
1127.0.0.1 localhost
2127.0.0.1 guest-desktop
3111.111.111.111 example.com
4111.111.111.111 test.com
这将拦截任何example.com
和test.com
的请求,并将其发送到您的服务器,这就是我们想要的,如果我们实际上不拥有我们正在使用的域名。
保存并关闭文件,当你完成。
步骤六:测试你的结果
现在你已经设置了,你应该测试你的服务器块是否正常工作. 你可以通过访问你的网页浏览器的域名来做到这一点:
1http://example.com
你应该看到一个看起来像这样的页面:
如果你访问你的第二个域名,你应该看到一个略有不同的网站:
1http://test.com
如果这两个网站都起作用,那么您已经成功配置了两个独立的服务器块,使用 Nginx。
在此时刻,如果您在本地计算机上调整了主机
文件以进行测试,您可能会想要删除所添加的行。
如果您需要访问您的服务器的域名,对于一个面向公众的网站,您可能需要为每个网站购买一个域名,您可以在这里学习如何将其设置为您的服务器(https://www.digitalocean.com/community/articles/how-to-set-up-a-host-name-with-digitalocean)。
结论
您现在应该能够为您希望从同一个服务器中托管的每个域创建服务器块,只要您的硬件能够处理流量,您可以创建的服务器块数量就没有真正的限制。