• 售前

  • 售后

热门帖子
入门百科

详解Nginx 静态文件服务设置及优化

[复制链接]
清风吹袭断 显示全部楼层 发表于 2021-10-26 13:26:48 |阅读模式 打印 上一主题 下一主题
根目录和索引文件

root 指令指定将用于搜刮文件的根目录。 为了获取所哀求文件的路径,NGINX 将哀求 URI 附加到 root 指令指定的路径。该指令可以放在 http {} , server {} 或 location {} 上下文中的任何级别。在下面的示例中,为捏造服务器界说了 root 指令。 它实用于未包罗根指令的所有 location {} 块,以显式重新界说根:
  1. server {
  2.   root /www/data;
  3.   location / {
  4.   }
  5.   location /images/ {
  6.   }
  7.   location ~ \.(mp3|mp4) {
  8.     root /www/media;
  9.   }
  10. }
复制代码
在这里,NGINX 针对 /images/ 开头的 URI 将在文件体系的 /www/ data/images/ 目录中搜刮相应文件。 如果 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 以返回自动天生的目录列表,请在 autoindex 指令中包罗 on 参数:
  1. location /images/ {
  2.   autoindex on;
  3. }
复制代码
你可以在 index 指令中列出多个文件名。 NGINX按指定的顺序搜刮文件并返回它找到的第一个文件。
  1. location / {
  2.   index index.$geo.html index.htm index.html;
  3. }
复制代码
这里使用的 $geo 变量是通过 geo 指令设置的自界说变量。变量的值取决于客户端的 IP 地址。
要返回索引文件,NGINX 会查抄它是否存在,然后对通过将索引文件的名称附加到根本 URI 上获得的新 URI 举行内部重定向。内部重定向导致对位置的新搜刮,并且大概最终位于另一个位置,如以下示例所示:
  1. location / {
  2.   root /data;
  3.   index index.html index.php;
  4. }
  5. location ~ \.php {
  6.   fastcgi_pass localhost:8000;
  7.   #...
  8. }
复制代码
这里,如果哀求中的 URI 是 /path/ ,并且 /data/path/index.html 不存在但 /data/path/index.php 存在,则内部重定向到 /path/index.php 将映射到第二个位置。结果,哀求被代理。
实行几种选择

try_files 指令可用于查抄指定的文件或目录是否存在; NGINX 会举行内部重定向,如果没有,则返回指定的状态代码。比方,要查抄对应于哀求 URI 的文件是否存在,请使用 try_files 指令和 $uri 变量,如下所示:
  1. server {
  2.   root /www/data;
  3.   location /images/ {
  4.     try_files $uri /images/default.gif;
  5.   }
  6. }
复制代码
该文件以 URI 的情势指定,使用在当前位置或捏造服务器的上下文中设置的根或别名指令举行处置处罚。在这种环境下,如果对应于原始 URI 的文件不存在,NGINX 会将内部重定向到末了一个参数指定的 URI,并返回 /www/data/images/default.gif 。
末了一个参数也可以是状态代码(直接以等号开头)或位置名称。 在以下示例中,如果 try_files 指令的所有参数都不会分析为现有文件或目录,则会返回 404 错误。
  1. location / {
  2.   try_files $uri $uri/ $uri.html =404;
  3. }
复制代码
在下一个示例中,如果原始 URI 和带有附加尾部斜杠的 URI 都不会分析为现有文件或目录,则会将哀求重定向到指定位置,并将其传递给代理服务器。
  1. location / {
  2.   try_files $uri $uri/ @backend;
  3. }
  4. location @backend {
  5.   proxy_pass http://backend.example.com;
  6. }
复制代码
有关更多信息,请观看 内容缓存 网络研讨会,相识怎样显着进步网站性能,并深入相识 NGINX 的缓存功能。
优化服务内容的性能

加载速度是提供任何内容的关键因素。 对 NGINX 配置举行微小优化可以进步生产力并资助实现最佳性能。
启用 sendfile
默认环境下,NGINX 会自行处置处罚文件传输,并在发送之前将文件复制到缓冲区中。 启用 sendfile 指令消除了将数据复制到缓冲区的步调,并允许将数据从一个文件描述符直接复制到另一个文件描述符。或者,为了防止一个快速连接完全占用工作进程,可以使用 sendfile_max_chunk 指令限制单个 sendfile() 调用中传输的数据量(在本例中为1 MB):
  1. location /mp3 {
  2.   sendfile      on;
  3.   sendfile_max_chunk 1m;
  4.   #...
  5. }
复制代码
启用 tcp_nopush
将 tcp_nopush 指令与 sendfile on; 指令一起使用。这使得 NGINX 可以在 sendfile() 获取数据块之后立刻在一个数据包中发送 HTTP 响应头。
  1. location /mp3 {
  2.   sendfile  on;
  3.   tcp_nopush on;
  4.   #...
  5. }
复制代码
启用 tcp_nodelay
tcp_nodelay 指令允许覆盖 Nagle 的算法 ,该算法最初筹划用于解决慢速网络中小数据包的问题。该算法将很多小数据包合并为一个较大的数据包,并以 200 毫秒的延长发送数据包。现在,在提供大型静态文件时,无论数据包巨细怎样,都可以立刻发送数据。延长也会影响在线应用步调(ssh,在线游戏,在线交易等)。默认环境下, tcp_nodelay 指令设置为 on,这意味着禁用了 Nagle的算法。此指令仅用于 keepalive 连接:
  1. location /mp3 {
  2.   tcp_nodelay    on;
  3.   keepalive_timeout 65;
  4.   #...
  5.   
  6. }
复制代码
优化积存队列

此中一个告急因素是 NGINX 可以多快地处置处罚传入连接。一样平常规则是在创建连接时,将其放入侦听套接字的 "listen" (监听)队列中。在正常负载下,队列很小或根本没有队列。但是在高负载下,队列会急剧增长,导致性能不均匀,连接停止,延长增长。
表现积存队列使用下令 netstat -Lan 来表现当前监听队列。输出大概如下所示,它表现在端口 80上的监听队列中,有 10 个未担当的连接,这些连接针对配置的最多 128 个排队连接。这种环境很正常。
  1. Current listen queue sizes (qlen/incqlen/maxqlen)
  2. Listen     Local Address     
  3. 0/0/128    *.12345      
  4. 10/0/128    *.80   
  5. 0/0/128    *.8080
复制代码
相反,在以下下令中,未担当的连接数(192)超过了 128 的限制。当网站流量很大时,这种环境很常见。要获得最佳性能,需要在操作体系和 NGINX 配置中增长可以排队等待 NGINX 担当的最大连接数。
  1. Current listen queue sizes (qlen/incqlen/maxqlen)
  2. Listen     Local Address     
  3. 0/0/128    *.12345      
  4. 192/0/128    *.80   
  5. 0/0/128    *.8080
复制代码
调解操作体系
将 net.core.somaxconn 内核参数的值从其默认值(128)增长到足以容纳大量流量的值。在这个例子中,它增长到 4096。
      
  • FreeBSD 的下令为 sudo sysctl kern.ipc.somaxconn=4096  
  • Linux 的下令为 1. sudo sysctl -w net.core.somaxconn=4096 2. 将 net.core.somaxconn = 4096 参加到 /etc/sysctl.conf 文件中。
调解 NGINX
如果将 somaxconn 内核参数设置为大于 512 的值,请将 backlog 参数增长在 NGINX listen 指令以匹配修改:
  1. server {
  2.   listen 80 backlog=4096;
  3.   # ...
  4. }
复制代码
© 文章翻译自Nginx Serving Static Content ,部门做了语义调解。

以上就是本文的全部内容,希望对大家的学习有所资助,也希望大家多多支持草根技术分享。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作