Nginx 静态内容
在本节中,我们将讨论如何配置 Nginx Plus 和 Nginx 开源以服务静态内容。
根目录和索引文件
root 指令用于定义将用于搜索文件的根目录。为了获得请求文件的路径,Nginx 将请求的 URI 附加到由 root 指令定义的路径。该指令可以放置在服务器 {}、http {} 或位置 {} 上下文中的任何级别。
让我们看一个示例;在这里,为虚拟服务器指定了 root 指令。它适用于所有没有添加 root 指令来显式重新定义根的 location {} 块:
server { root /www/data; location / { } location /images/ { } location ~ \.(mp3|mp4) { root /www/media; } }
在上面的例子中,Nginx 在文件系统的/www/data/images/目录中搜索以/images/开头的 URI(统一资源标识符)。但是如果 URI 以 .mp3 或 .mp4 扩展名结尾,Nginx 会在/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 / { 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 映射到第二个位置。结果,请求被代理。
尝试多个选项
try_files 指令可用于检查定义的文件或目录是否存在;如果有,Nginx 会进行内部重定向,如果没有,则返回指定的状态代码。例如,要检查文件是否与请求 URI 对应,请使用 try_files 指令和 $uri 变量,如下所示:
server { root /www/data; location /images/ { try_files $uri /images/default.gif; } }
文件以 URI 的形式定义,使用在当前位置或虚拟服务器的上下文中设置的根或别名指令进行处理。在这种情况下,如果原始 URI 对应的文件不存在,Nginx 将内部重定向到最后一个参数指定的 URI,返回/www/data/images/default.gif。
最后一个参数也可以是一个状态码,直接在等号或位置名称之前。在下面的示例中,如果 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; #... }
下一章:Nginx TCP 和 UDP 负载平衡
Nginx Plus 可以代理和负载平衡 TCP(传输控制协议) 流量。 TCP 是许多流行应用程序和服务的协议,例如 MySQL、LDAP 和 RTMP。同样,Nginx Plus 可以代理和负载 ...