在本节中,我们将讨论如何配置 Nginx 静态内容。
root 指令用于定义将用于搜索文件的根目录。为了获得请求文件的路径,NGINX 将请求的 URI 附加到由 root 指令定义的路径。该指令可以放置在服务器 {}、http {} 或位置 {} 上下文中的任何级别。
让我们看一个例子;在这里,为虚拟服务器指定了 root 指令。它适用于所有没有添加 root 指令来显式重新定义 root 的 location {} 块:
server { root /www/data; location / { } location /images/ { } location ~ \.(mp3|mp4) { root /www/media; } }
如果请求后缀带有斜杠,NGINX 会将其视为对目录的请求,并尝试在该目录中查找索引文件并返回。index 指令指定索引文件的名称(默认值为 index.html)。继续这个例子,如果请求 URI 是/images/some/path/,NGINX 传送文件/www/data/images/some/path/index.html如果它存在。如果没有,则默认情况下 NGINX 返回 HTTP 代码 404(未找到)。要将 NGINX 配置为返回自动生成的目录列表,请将“on”参数添加到自动索引指令中:
location /images/ { autoindex on; }
我们可以在 index 指令中列出多个文件名。NGINX 按指定顺序查找文件并返回它找到的第一个文件。
location / { index index.$geo.html index.htm index.html; }
这里使用的 $geo 变量是通过 geo 指令设置的自定义变量。该变量的值取决于客户端的 IP 地址。
为了返回索引文件,NGINX 检查文件是否存在,然后通过将索引文件的名称附加到基本 URI 来进行内部重定向到 URI。这个内部重定向产生一个新的 location 搜索匹配过程,如下例所示:
location / { root /data; index index.html index.php; } location ~ \.php { fastcgi_pass localhost:8000; #... }
在上面的例子中,如果请求中的 URI 是 /path/,并且 /data/path/index.html 不存在但 /data/path/index.php 存在,则内部重定向到 /path/index.php ,然后新的匹配到第二个 location ~ \.php { } ,请求被代理。
try_files 指令可用于检查定义的文件或目录是否存在;如果有,NGINX 会进行内部重定向,如果没有,则返回指定的状态代码。例如,要检查文件是否与请求 URI 对应,请使用 try_files 指令和 $uri 变量,如下所示:
server { root /www/data; location /images/ { try_files $uri /images/default.gif; } }
该文件以 URI 的形式定义,使用在当前位置或虚拟服务器的上下文中设置的 root 或 alias 指令进行处理。在这种情况下,如果原始 URI 对应的文件不存在,NGINX 将内部重定向到最后一个参数指定的 URI,返回 /www/data/images/default.gif。
最后一个参数也可以是一个状态码,直接在等号或命名 location 之前。在下面的示例中,如果 try_files 指令的任何参数都没有解析为现有文件或目录,则会返回 404 错误。
location / { try_files $uri $uri/ $uri.html =404; }
加载速度是提供任何内容的关键因素。对我们的 NGINX 配置进行小幅优化可能会提高生产力并有助于达到最佳性能。
启用发送文件
默认情况下,NGINX 自己控制文件传输,并在发送之前将文件复制到缓冲区中。当我们启用 sendfile 指令时,它将消除将数据复制到缓冲区的步骤,并允许将数据从一个文件描述符直接复制到另一个文件描述符。或者,为了阻止快速连接完全占用工作进程,我们可以使用 sendfile_max_chunk 指令来限制在单个 sendfile() 调用中传输的数据量(在本例中为 1 MB):
location /mp3 { sendfile on; sendfile_max_chunk 1m; #... }
启用 tcp_nopush
将 tcp_nopush 指令与指令中的 sendfile 一起添加。这使 NGINX 能够在从 sendfile() 获取数据块后立即在一个数据包中发送 HTTP 响应标头。
location /mp3 { sendfile on; tcp_nopush on; #... }