本文档涵盖的是不再受支持的 Ubuntu 版本。如果您目前正在运行 Ubuntu 12.04 服务器,我们强烈建议升级或迁移到受支持的 Ubuntu 版本:
- 升级到 Ubuntu 14.04
- 从 Ubuntu 14.04 升级到 Ubuntu 16.04
- 将服务器数据迁移到受支持的版本
原因: 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” 目录也可以用于站点配置。在此目录中以 “.conf” 结尾的每个文件在 Nginx 启动时都会被读入配置,因此请确保每个文件定义有效的 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” 指令指定错误日志位置等内容。
文件的下一部分是 events 部分。这是一个特殊的位置,用于控制 Nginx 如何处理连接。在我们的示例中,我们不需要在此部分进行任何调整,因此我们将继续进行。
接下来的部分是 http 块。这导致了有关 Nginx 配置文件格式的更复杂的讨论。
Nginx 配置文件布局
Nginx 配置文件以 “块” 的形式进行管理。
我们看到的第一个块是 events 块。接下来是 http 块,这是配置文件中的主要层次结构的开始。
http 块中的配置细节是分层的,封闭块从其所在的块继承属性。Nginx 的大多数一般配置都在 http 块中进行,其中包含服务器块,服务器块又包含位置块。
重要的是,您应该始终将配置细节放入适用的最高容器中。这意味着,如果您希望参数 X 应用于每个服务器块,则将其放在 http 块内将导致其传播到每个服务器配置。
如果您查看我们的文件,您会注意到它具有许多选项,这些选项指示软件应该如何作为一个整体运行。这是这些指令的适当位置。
例如,我们设置了文件压缩选项:
gzip on;
gzip_disable "msie6";
这告诉 Nginx 启用 gzip 以压缩发送到客户端的数据,但在客户端是 Internet Explorer 6 时禁用 gzip 压缩,因为该浏览器不理解 gzip 压缩。
如果您有应该对某些服务器块具有不同值的选项,您可以在更高级别指定它们,然后在服务器块内覆盖它们。Nginx 将采用适用于设置的最低级别规范。
在最可能的*别应用设置的风格可以避免您管理多个相同声明。它还具有提供默认值的优势,可以在忘记在 “server” 块级别或以下声明某些内容时使用。
在 “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 /” 行指定括号内的指令将适用于客户端请求的所有不匹配其他位置块的资源。
位置块可以包含像文件中进一步指定的 “/doc/” 路径一样的 uri 路径,可以在位置和 uri 之间使用等号(=)指定精确匹配,或使用波浪号(~)字符指示正则表达式匹配。
纯波浪号表示区分大小写的匹配,后面跟着星号(*)表示不区分大小写的匹配,以及以插入符(^)开头的波浪号告诉 Nginx 如果 uri 匹配此位置,则不执行正则表达式搜索。
位置匹配类似于 server_name 匹配,Nginx 有一个明确定义的过程来决定使用哪个块。
如果查询与具有等号的位置匹配,将使用该位置并停止搜索。如果没有,则将搜索常规的文字 uri 位置。如果使用了插入符波浪号(^~),并且 uri 位置匹配,则将选择此块。
如果未使用该选项,它将选择最具体的匹配并保存该值。然后,它将执行正则表达式匹配,以查看是否可以匹配任何这些模式。如果找到一个,则使用正则表达式块。如果没有找到,则使用先前匹配的 uri 位置。
总之,Nginx 更喜欢精确匹配,然后是正则表达式匹配,然后是文字 URI 匹配,但可以通过在文字 URI 匹配之前加上 “^~” 来明确地使文字 URI 匹配更重要。
此列表定义了这些首选项:
- 等号匹配
- 具有 “^~” 的文字 URI 匹配
- 最具体的正则表达式匹配
- 最具体的文字 URI 匹配
尽管这可能看起来令人困惑,但这些定义的规则是必要的,以便 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 为指定位置生成目录列表。当请求目录时,将返回此列表。
“allow” 和 “deny” 行为目录设置访问控制。我们文件中的行允许在尝试从本地服务器访问位置时读取内容。
结论
Nginx 对一些功能使用了不同的术语,但它是一个非常强大的服务器,具有许多配置选项。
学习如何正确配置 Nginx Web 服务器将使您能够充分利用一款既非常强大又资源消耗极低的软件。这使它成为任何规模网站的理想选择。