NGINX 服务静态内容

2024 年 8 月 29 日 | 4 分钟阅读

在本节中,我们将讨论如何配置 Nginx Plus 和 Nginx 开源版来服务静态内容。

根目录和索引文件

root 指令用于定义将用于搜索文件的根目录。为了获取所请求文件的路径,NGINX 将所请求的 URI 附加到由 root 指令定义的路径。该指令可以放置在 server {}、http {} 或 location {} 上下文内的任何级别。

让我们看一个例子;这里,为虚拟服务器指定了 root 指令。它适用于未添加 root 指令以重新定义根目录的所有 location {} 块

在上面的例子中,NGINX 在文件系统中搜索以 /images/ 开头的 URI(统一资源标识符),该 URI 位于 /www/data/images/ 目录中。但是,如果 URI 以 .mp3 或 .mp4 扩展名结尾,NGINX 会改为在 /www/media/ 目录中查找文件,因为它是在匹配的 location 块中指定的。

如果请求以斜杠结尾,NGINX 会将其视为对目录的请求,并尝试在目录中查找索引文件。index 指令指定索引文件的名称(默认值为 index.html)。继续上面的例子,如果请求 URI 为 /images/some/path/,如果该文件存在,NGINX 将提供文件 /www/data/images/some/path/index.html。如果它不存在,则默认情况下 NGINX 返回 HTTP 代码 404(未找到)。要配置 NGINX 返回自动生成的目录列表,请将 "on" 参数添加到 auto index 指令

我们可以在 index 指令中列出多个文件名。NGINX 按指定的顺序查找文件,并返回它找到的第一个文件。

这里使用的 $geo 变量是通过 geo 指令设置的自定义变量。该变量的值取决于客户端的 IP 地址。

为了返回索引文件,NGINX 检查该文件是否存在,然后进行内部重定向到通过将索引文件的名称附加到基本 URI 获得的 URI。内部重定向导致重新搜索一个位置,并可能最终进入另一个位置,如下例所示

在上面的例子中,如果请求中的 URI 是 /path/,并且 /data/path/index.html 不存在,但 /data/path/index.php 存在,则内部重定向到 /path/index.php 将映射到第二个位置。结果,该请求被代理。

尝试多种选择

try_files 指令可用于检查定义的文件或目录是否存在;如果存在,NGINX 会进行内部重定向,如果不存在,则返回指定的状态代码。例如,要检查与请求 URI 对应的文件是否存在,请使用 try_files 指令和 $uri 变量,如下所示

该文件以 URI 的形式定义,该 URI 使用在当前位置或虚拟服务器的上下文中设置的 root 或 alias 指令进行处理。在这种情况下,如果与原始 URI 对应的文件不存在,NGINX 将进行内部重定向到由最后一个参数指定的 URI,返回 /www/data/images/default.gif。

最后一个参数也可以是一个状态代码,它直接位于等号或一个位置的名称之前。在下面的例子中,如果 try_files 指令的任何参数都无法解析为现有的文件或目录,则会返回 404 错误。

优化服务内容的性能

加载速度是服务任何内容的关键因素。对我们的 NGINX 配置进行一些小的优化可能会提高生产力,并有助于达到最佳性能。

启用 sendfile

默认情况下,NGINX 自己控制文件传输,并在发送之前将文件复制到缓冲区中。当我们启用 sendfile 指令时,它将消除将数据复制到缓冲区的步骤,并启用将数据从一个文件描述符直接复制到另一个文件描述符。或者,为了阻止快速连接完全占用工作进程,我们可以使用 sendfile_max_chunk 指令来限制在单个 sendfile() 调用中传输的数据量(在此示例中,为 1 MB)

启用 tcp_nopush

将 tcp_nopush 指令与 sendfile 指令一起添加到指令中。这使 NGINX 可以在从 sendfile() 获取数据块后立即在一个数据包中发送 HTTP 响应标头。