Status:已弃用
本文介绍不再受支持的 Ubuntu 版本。如果您当前运行的服务器运行 Ubuntu 12.04,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
-
升级到Ubuntu 14.04.
- 从 Ubuntu 14.04 升级到 Ubuntu 16.04
- 将服务器数据迁移到支持的版本
Reason:
Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL)并且不再接收安全补丁或更新。本指南不再维护。
请参阅:
本指南可能仍然可以作为参考,但可能不适用于其他 Ubuntu 版本。如果有的话,我们强烈建议您使用针对您所使用的 Ubuntu 版本编写的指南。您可以使用页面顶部的搜索功能来查找更新的版本。
什么是 Nginx?
Nginx 是一个 Web 服务器和反向代理服务器。它已被广泛采用,并正在取代许多其他常见选项。
虽然 Nginx 是一个功能强大的工具,但它的配置对于那些来自其他服务器的人或一般来说不熟悉 Web 服务器的人来说可能会令人生畏。在本指南中,我们将探索主要的 Nginx 配置文件并揭开一些语法和选项的神秘面纱。
我们将使用 Ubuntu 12.04 安装,但大多数发行版都将配置类似的文件位置。
Nginx 配置目录层次结构
Nginx 将其配置文件存储在“/etc/nginx”目录中。
在这个目录中,您会发现一些目录和各种模块化配置文件:
cd /etc/nginx
ls -F
conf.d/ koi-win naxsi.rules scgi_params uwsgi_params
fastcgi_params mime.types nginx.conf sites-available/ win-utf
koi-utf naxsi_core.rules proxy_params sites-enabled/
如果您来自 Apache,那么“sites-available”和“sites-enabled”目录将会很熟悉。
这些目录用于定义您网站的配置。文件通常在“sites-available”目录中创建,然后在准备上线时符号链接到“sites-enabled”目录。
“conf.d”目录也可用于站点配置。当 Nginx 启动时,此目录中以“.conf”结尾的每个文件都会被读入配置中,因此请确保每个文件都定义了有效的 Nginx 配置语法。
“/etc/nginx”目录中的大多数其他文件包含特定进程或可选组件的配置详细信息。
然而,“nginx.conf”文件是主要的配置文件。我们将更深入地探讨该文件。
探索 nginx.conf 文件
nginx.conf 文件是 Nginx 的主要控制点。该文件读取所有其他适当的配置文件,并在服务器启动时将它们组合成一个整体配置文件。
打开该文件以便我们讨论一般格式:
sudo nano /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
. . .
前几行用于定义有关 Nginx 如何运行的一些一般事实。
例如,服务器通过“user www-data”行决定以哪个用户身份运行。这是 Ubuntu 的典型 Web 服务器用户。
“pid”指令指定进程 pid 的存储位置以供内部参考。 “worker_processes”定义 Nginx 将使用多少个并发进程。
配置文件的这一部分还可以包含使用“error_log”指令的错误日志位置之类的内容。
我们文件的下一部分是事件部分。这是一个控制 Nginx 如何处理连接的特殊位置。在我们的示例中,我们不需要调整本节中的任何内容,因此我们将继续。
以下部分是 http 块。这导致了关于 Nginx 配置文件如何格式化的更复杂的讨论。
Nginx 配置文件布局
Nginx 配置文件是按“块”进行管理的。
我们看到的第一个块是事件块。下一个是 http 块,也是配置文件中主层次结构的开始。
http 块中的配置详细信息是分层的,封闭的块继承了它们所在块的属性。Nginx 的大部分常规配置都发生在 http 块中,该块包含服务器块,而服务器块又包含位置块。
重要的是,您应该始终将配置详细信息放入它们适用的最高容器中。这意味着,如果您希望参数 X 应用于每个服务器块,那么将其放置在 http 块中将导致它传播到每个服务器配置。
如果您查看我们的文件,您会注意到它有许多选项,这些选项决定了软件作为一个整体如何运行。这是此类指令的适当位置。
例如,我们使用以下几行设置文件压缩选项:
gzip on;
gzip_disable "msie6";
这告诉 Nginx 启用 gzip 来压缩发送到客户端的数据,但当客户端是 Internet Explorer 版本 6 时禁用 gzip 压缩,因为该浏览器不支持 gzip 压缩。
如果您的选项对于某些服务器块应具有不同的值,则可以在更高级别指定它们,然后在服务器块内覆盖它们。 Nginx 将采用适用于设置的最低级别规范。
这种在尽可能最高级别应用设置的方式使您不必管理多个相同的声明。它还具有提供默认值的优点,如果您忘记在“服务器”块级别或以下级别声明某些内容,可以使用默认值。
在“nginx.conf”文件中,我们可以看到“http”块的末尾有:
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
这告诉我们,定义特定站点和 url 匹配位置的服务器和位置块将发生在该文件之外。
这使我们能够维护模块化配置安排,当我们想要为新站点提供服务时,我们可以创建新文件。它允许我们将相关内容分组在一起,同时隐藏在大多数情况下不会改变的细节。
退出“nginx.conf”文件,以便我们可以在下一节中检查单个站点配置。
探索默认服务器块
Nginx 使用服务器块来完成 Apache 虚拟主机中的功能。将服务器块视为服务器可以托管的各个网站的规范。
我们将查看位于“sites-available”目录中包含的默认服务器块配置。该文件包含提供默认网页所需的所有必要信息。
cd sites-available
sudo nano default
server {
root /usr/share/nginx/www;
index index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ /index.html;
}
location /doc/ {
alias /usr/share/doc/;
autoindex on;
allow 127.0.0.1;
deny all;
}
}
默认文件有很好的注释,但我删除了此处的注释以节省空间并演示站点的定义是多么简单。
我们有一个服务器块,其中包含左括号和相关右括号之间的所有内容:
server {
. . .
}
通过使用“include”指令,将该块放置在“nginx.conf”文件中靠近 http 块末尾的位置,正如我们在上一节中讨论的那样。
“root”指令定义网站内容所在的目录。这是 Nginx 开始查找浏览器请求的文件的位置。默认网站在“/usr/share/nginx/www”中搜索其内容。
请注意每行如何以分号 (;) 结尾。这就是 Nginx 知道一个指令已完成并且下一个指令将开始的方式。不要忘记分号,否则 Nginx 会将后面的行视为指令的附加参数。它将执行此操作,直到到达分号为止。
下一行涉及“index”指令。
这将配置为域提供的默认页面。如果没有请求页面,服务器块将搜索名为“index.html”的文件并返回它。如果找不到该文件,它将尝试提供名为“index.htm”的文件。
使用 server_name 指令
“server_name”指令包含将从该服务器块提供服务的域名列表。您可以包含任意多个名称,并用空格分隔。
您还可以在服务器名称的开头或结尾使用星号字符作为匹配所有内容的通配符。例如,“*.example.com”将匹配“forum.example.com”和“animals.example.com”的请求。
如果请求的 url 匹配多个“server_name”指令,它将选择第一个完全匹配的那个。如果没有完全匹配,它将选择以星号开头的最长通配符名称。
如果仍未找到匹配项,它将查找以星号结尾的最长匹配通配符名称。如果没有找到这些,它将返回第一个匹配的正则表达式匹配项。
使用正则表达式匹配的服务器名称以波形符 (~) 字符开头。正则表达式非常强大,但超出了本文的范围。
使用位置块
配置文件的下一部分打开一个位置块。位置块用于指定如何在服务器内处理某些资源请求。
“location /”行指定括号内的指令将应用于客户端请求的与其他位置块不匹配的所有资源。
位置块可以包含 uri 路径,例如在文件中进一步指定的“/doc/”路径,可以在位置和 uri 之间使用等号 (=) 来指定精确匹配,或者使用波浪号 (~) 字符来指示常规表达式匹配。
普通波浪号表示区分大小写的匹配,波浪号后跟星号 (~*) 表示不区分大小写匹配,波浪号前面带有克拉 (^~) 告诉 Nginx 如果 uri 与此位置匹配,则不执行正则表达式搜索。
位置匹配类似于 server_name 匹配,因为 Nginx 有一个明确定义的过程来决定使用哪个块。
如果查询与带有等号的位置匹配,则使用该位置并停止搜索。如果没有,则搜索常规文字 uri 位置。如果使用了克拉波浪号 (^~) 并且 uri 位置匹配,则将选择此块。
如果未使用该选项,它将选择最具体的匹配并保留该值。然后它将执行正则表达式匹配以查看是否可以匹配这些模式中的任何一个。如果找到,则使用正则表达式块。如果没有,则使用之前匹配的 uri 位置。
总而言之,Nginx 更喜欢精确匹配,然后是正则表达式匹配,然后是文字 URI 匹配,但文字 URI 匹配可以通过在它们前面加上“^~”来显式地变得更加重要。
此列表定义了这些首选项:
<ol>
<li>Equal sign matches</li>
<li>Literal URI matches with "^~"</li>
<li>Most specific regular expression match</li>
<li>Most specific literal URI match</li>
</ol>
尽管这可能看起来令人困惑,但这些定义的规则是必要的,以便 Nginx 可以毫不含糊地做出决定。
如何使用 try_files
try_files 指令是一个非常有用的工具,用于定义应对资源请求进行的一系列尝试。
这意味着您可以声明您希望 Nginx 如何尝试通过一系列替代选项来服务请求。
默认配置文件中的示例是:
try_files $uri $uri/ /index.html;
这意味着当发出由该位置块提供服务的请求时,Nginx 将首先尝试将文字 uri 作为文件提供。这是使用“$uri”变量声明的,该变量将保存所请求的资源。
如果没有与 $uri 的值匹配的文件,那么它将尝试使用 uri 作为目录。它将尝试为 uri 目录提供默认文件(我们的文件是 index.html,如果您还记得的话)。
如果没有与 $uri 的值匹配的目录,则它使用默认文件,即服务器块根目录中的“index.html”文件。每个“try_files”指令都使用最后一个参数作为后备默认值,因此它必须是已知的真实文件。
如果您不希望在前面的参数不匹配的情况下返回文件,则另一个选项是返回错误页面。这是使用等号和错误代码来完成的。
例如,如果我们希望“location /”块在无法找到资源时返回 404 错误,而不是提供默认的“index.html”页面,我们可以用“=404”替换最后一个文件:
try_files $uri $uri/ =404;
如果用户请求不存在的资源,这将向用户抛出适当的错误页面。
其他选项
配置文件的其余部分包含一些其他有趣的指令。
“alias”指令告诉 Nginx 该位置块的页面应该在指定的目录之外提供。这些可以在根目录之外。
在我们的示例中,“/doc/”中请求的资源将从“/usr/share/doc/”中提供。
“autoindex on”指令允许 Nginx 生成指定位置的目录列表。当请求目录时,这将被返回。
“允许”和“拒绝”行设置目录的访问控制。当用户尝试从本地服务器访问该位置时,我们文件中的行允许读取内容。
结论
Nginx 对其某些功能使用不同的术语,但它是一个功能非常强大的服务器,具有许多配置选项。
学习如何正确配置 Nginx Web 服务器将使您能够充分利用一款功能强大且占用资源极少的软件。这使其成为任何规模网站的理想选择。
贾斯汀·埃林伍德