18个运维必知的Nginx代理缓存设备技能(你都控制了哪些呢)

发布时间: 2019-09-30 12:29:45 来源: 互联网 栏目: 办事器 点击:

这篇文章重要简介了18个运维必知的Nginx代理缓存设备技能(你都控制了哪些呢),文中经过过程示例代码简介的异常详细,对大年夜家的进修或许任务具有必定的参考进修价值,须要的同伙们下面随着小编来一路进修进修吧

我们都知道应用法式榜样和网站的性能是他们成功的关键身分。然则,使您的应用法式榜样或网站表示更好的过程其实不总是很清楚。代码质量和基本架构固然相当重要,但在很多情况下,您可以经过过程专注于一些异常根本的应用法式榜样的交付技巧,对应用法式榜样的终究用户体验停止大年夜量改进。

个中一个例子是在应用法式榜样栈中完成和优化缓存。在教程中简介的技巧可以赞助老手和高等用户应用 Nginx 中包含的内容缓存功能,从而取得更好的性能。

概览

内容缓存位于客户端和源办事器 (upstream) 之间,并保存它看到的一切内容的正本。假设客户端请求缓存已存储的内容,则它会直接前往内容而不连接源办事器。这进步了性能,由于内容缓存更接近客户端,并且更有效地应用应用法式榜样办事器,由于它们不用每次都从头开端生成页面。

Web 浏览器和应用法式榜样办事器之间能够存在多个缓存:客户真个浏览器缓存,中心缓存,内容交付搜集(CDN)和位于应用法式榜样办事器前面的负载均衡器或反向代理。即使在反向代理/负载均衡器级别,缓存也能够极大年夜地进步性能。

这里举一个例子,比如我的站点应用 Next.js 办事器端口衬着,由于办事器性能比较差,固然 $5 的办事器,其实不克不及希冀好到那边去,能用就曾经异常了不得,能进入这个局域网就好了,别希冀太多。

每次翻开页面将近花费 7 秒阁下,当这个中包含搜集延迟,但当我直接在办事器端(127.0.0.1) 提议请求时,时直接近 5 秒,然后再清除从数据库获得数据时间,办事器端衬着时间用了 4.5 秒,其实太慢,此时我能想到最快处理成绩答案就是缓存,但在那边参加缓存,从每步时间看来,在 Nginx 参加缓存最快处理成绩

Nginx 平日作为应用法式榜样客栈中的反向代理或负载均衡器安排,并具有一整套缓存功能。下面我们将评论辩论若何应用 Nginx 设备根本缓存。

若何设置和设备根本缓存

只须要两个指令便可启用根本缓存:proxy_cache_path 和 proxy_cache。

proxy_cache_path 指令设置缓存的途径和设备,proxy_cache 用来指令激活它。

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g 
         inactive=60m use_temp_path=off; 
 
 
server { 
  # ... 
  location / { 
    proxy_cache my_cache; 
    proxy_pass http://my_upstream; 
  } 
}

proxy_cache_path 指令的参数定义了以下设置:

缓存的本地磁盘目次称为 /path/to/cache/。

  • levels 在/path/to/cache/ 下设置一个两级目次层次构造。在单个目次中包含大年夜量文件会降低文件拜访速度,是以我们建议对大年夜多半安排应用两级目次层次构造。假设 levels 未包含该参数,Nginx 会将一切文件放在同一目次中。
  • keys_zone 设置共享内存区域,用于存储缓存键和元数据,例如应用计时器。具有内存中的密钥正本,Nginx 可以快速肯定请求能否是一个 HIT 或 MISS 不用转到磁盘,从而大年夜大年夜加快了检查速度。1 MB 区域可以存储大年夜约 8,000 个密钥的数据,是以示例中设备的 10 MB 区域可以存储大年夜约 80,000 个密钥的数据。
  • max_size 设置缓存大年夜小的下限(在本例中为 10 千兆字节)。它是可选的; 不指定值许可缓存增长以应用一切可用磁盘空间。当缓存大年夜小达到限制时,一个称为缓存管理器的过程将删除比来最少应用的缓存,将大年夜小恢复到限制之下的文件。
  • inactive 指定项目在未被拜访的情况下可以保存在缓存中的时间长度。在此示例中,缓存管理器过程会主动从缓存中删除 60 分钟未请求的文件,不管其能否已过时。默许值为 10 分钟(10m)。非活动内容与过时内容不合。Nginx 不会主动删除缓存 header 定义为已过时内容(例如 Cache-Control:max-age=120)。过时(陈腐)内容仅在指准时间内未被拜访时被删除。拜访过时内容时,Nginx 会从原始办事器刷新它偏重置 inactive 计时器。
  • Nginx 起首将发往高速缓存的文件写入临时存储区域,use_temp_path=off 指令指导 NGINX 将它们写入将被高速缓存的雷同目次。我们建议您将此参数设置 off 为防止在文件体系之间停止不须要的数据复制。use_temp_path 在 Nginx 1.7.10 中引入。

最后,该 proxy_cache 指令激活与父 location 块的 URL 婚配的一切内容的缓存(在示例中为/)。您还可以在 server 块中包含 proxy_cache 指令; 它实用于没有本身的 location 指令的办事器的一切块。

当上游办事器封闭()时供给缓存内容

Nginx 内容缓存的一个强大年夜功能是,Nginx 可以设备为在没法从原始办事器获得新内容时从缓存中供给已缓存的内容。假设缓存资本的一切源办事器都已封闭或临时占用,则会产生这类情况。

Nginx 不是将缺点传递给客户端,而是从缓存中供给文件的陈腐版本。这为 Nginx 代理的办事器供给了额外的容错才能,并确保在办事器毛病或流量岑岭时的正常运转时间。要启用此功能,请包含 proxy_cache_use_stale 指令:

location / { 
  # ... 
  proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; 
}

应用此示例设备,假设 Nginx 从原始办事器收到一个 error,timeout 或任何指定的 5xx 缺点,并且在其缓存中具有所请求文件的过时版本,则它会传递过时文件,而不是将缺点转发到客户端。

若何进步缓存性能

Nginx 具有丰富的可选设置,可用于微调缓存的性能。这是一个激活个中一些的例子:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g 
         inactive=60m use_temp_path=off; 
 
 
server { 
  # ... 
  location / { 
    proxy_cache my_cache; 
    proxy_cache_revalidate on; 
    proxy_cache_min_uses 3; 
    proxy_cache_use_stale error timeout updating http_500 http_502 
               http_503 http_504; 
    proxy_cache_background_update on; 
    proxy_cache_lock on; 
 
 
    proxy_pass http://my_upstream; 
  } 
}

这些指令设备以下行动:

  • proxy_cache_revalidate 指导 Nginx 在应用 GET 条件请求时,从源办事器刷新内容。假设客户端请求缓存然则由缓存控制头定义的过时的内容,则 Nginx将 If-Modified-Since 字段包含在 GET 请求的标头中将它发送到源办事器。由于办事器只要在 Nginx 最后缓存它时自附加到文件的标题 Last-Modified 中记录的时间以来修改了全部项目。
  • proxy_cache_min_uses 设置客户端在 Nginx 缓存之前必须请求若干次才被缓存。假设缓存赓续填满,这将异常有效,由于它可确保只将最常拜访的项添加到缓存中。默许 proxy_cache_min_uses 设置为 1。
  • 指令 updating 参数 proxy_cache_use_stale 与启用 proxy_cache_background_update 指令相结合,指导当客户端请求已过时或正在从原始办事器更新的项目时,Nginx 会传递过时的内容。一切更新都将在后台完成。在完全下载更新的文件之前,将为一切请求前往陈腐文件。
  • 与 proxy_cache_lock 启用,假设多个客户端请求的文件不在缓存(MISS),只要第一个这些请求是经过过程原始办事器的。其他请求等待满足该请求,然后从缓存中提取文件。假设 proxy_cache_lock 未启用,会招致缓存未射中的一切请求都将直接发送到源办事器。

跨多个硬盘拆分缓存

假设您有多个硬盘驱动器,可以应用 Nginx 在它们之间拆分缓存。以下示例根据请求 URI 将客户端均匀分布在两个硬盘驱动器上:

proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m 
         max_size=10g inactive=60m use_temp_path=off; 
proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m 
         max_size=10g inactive=60m use_temp_path=off; 
 
 
split_clients $request_uri $my_cache { 
       50%     “my_cache_hdd1”; 
       50%     “my_cache_hdd2”; 
} 
 
 
server { 
  # ... 
  location / { 
    proxy_cache $my_cache; 
    proxy_pass http://my_upstream; 
  } 
}

这两个 proxy_cache_path 指令在两个不合的硬盘驱动器上定义了两个缓存(my_cache_hdd1 和 my_cache_hdd2)。

split_clients 设备块指定从一半的请求(成果50%)被缓存在 my_cache_hdd1 与另外一半中 my_cache_hdd2。基于 $request_uri 变量的哈希(请求URI)肯定每个请求应用哪个缓存,成果是对给定URI的请求总是缓存在同一缓存中。

请留意,此办法不克不及替换 RAID 硬盘设置。假设存在硬盘驱动器毛病,则能够招致体系出现弗成猜想的行动,包含用户看到针对毛病硬盘驱动器的请求的 500 照应代码。恰当的 RAID 硬盘设置可以处理硬盘毛病。

若何对 Nginx Cache 停止检测

可以在照应头中参加 $upstream_cache_status 变量以停止检测

add_header X-Cache-Status $upstream_cache_status;

此示例 X-Cache-Status 在照应客户端时添加 HTTP 标头。以下是能够的值 $upstream_cache_status:

  • MISS - 在缓存中找不到照应,是以从原始办事器获得照应。然后缓存照应。
  • BYPASS - 照应是从原始办事器获得的,而不是从缓存中供给的,由于请求与 proxy_cache_bypass 指令婚配
  • EXPIRED - 缓存中的条目已过时。照应包含来自原始办事器的新内容。
  • STALE- 内容过时,由于源办事器未精确照应但 proxy_cache_use_stale 已设备。
  • UPDATING- 内容过时,由于条目以后正在更新以照应先前的请求,并且 proxy_cache_use_stale updating 已设备。
  • REVALIDATED- proxy_cache_revalidate 指令已启用,Nginx 验证以后缓存的内容能否依然有效经过过程(If-Modified-Since或If-None-Match)。
  • HIT - 照应直接来自有效的缓存

Nginx 若何肯定能否要缓存照应

默许情况下,Nginx 尊敬 Cache-Control 源办事器的标头。它不缓存照应 Cache-Control 设置为 Private,No-Cache 或 No-Store 或 Set-Cookie 在照应头。Nginx 只缓存 GET 和 HEAD 客户端请求。您可以按照以下答案中的解释覆盖这些默许值。

假设 proxy_buffering 设置为 off,Nginx 不会缓存照应。on 默许的。

Nginx 能否可以忽视 Cache-Control

应用 proxy_ignore_headers 指令可以忽视 Cache-Control

location /images/ { 
  proxy_cache my_cache; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_valid any 30m; 
  # ... 
}

Nginx 忽视 /images/ Cache-Control 下一切内容的标题。该指令强迫缓存数据到期,假设忽视标头则须要。Nginx 不会缓存没有过时的文件。

Nginx 能否可以忽视 Set-Cookie

应用 proxy_ignore_headers 指令便可。

Nginx 若何缓存 POST 请求

应用 proxy_cache_methods 指令:

proxy_cache_methods GET HEAD POST;

此示例启用了POST请求的缓存。

Nginx 若何缓存静态内容
只需 Cache-Control 标头许可。即使在很短的时间内缓存静态内容也能够增添原始办事器和数据库的负载,从而延长第一个字节的时间,由于不用为每个请求从重生成页面。

若何不应用 Nginx 缓存

proxy_cache_bypass 指令

location / { 
  proxy_cache_bypass $cookie_nocache $arg_nocache; 
  # ... 
}

该指令定义了 Nginx 急速从源办事器请求内容的请求类型,而不是起首测验测验在缓存中找到它。这有时被称为经过过程缓存 “打孔”。

Nginx 应用甚么缓存密钥

Nginx 生成的密钥的默许情势类似于以下 Nginx 变量的 MD5 哈希:$scheme$proxy_host$request_uri; 应用的实际算法稍微复杂一些。

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g 
         inactive=60m use_temp_path=off; 
 
 
server { 
  # ... 
  location / { 
    proxy_cache my_cache; 
    proxy_pass http://my_upstream; 
  } 
}

关于此示例设备,缓存密钥 http://www.example.org/my_image.jpg 计算为 md5(“http://my_upstream:80/my_image.jpg”)。

请留意,proxy_host 变量用于散列值而不是实际主机名(www.example.com)。proxy_host 定义为 proxy_pass 指令中指定的代理办事器的称号和端口。

要更改用作密钥基本的变量,请应用该 proxy_cache_key 指令。

应用 Cookie 作为我的缓存密钥的一部分

缓存键可以设备为随便任性值,例如:

proxy_cache_key $proxy_host$request_uri$cookie_jessionid;

此示例将 JSESSIONID cookie 的值归并到缓存键中。具有雷同 URI 但 JSESSIONID 值不合的项目将作为唯一项目伶仃缓存。

Nginx 应用 ETag 标头

在 Nginx 1.7.3 及更高版本中,ETag 标头完全支撑 If-None-Match。

Nginx 若何处理字节范围请求

假设文件在高速缓存中是最新的,则 Nginx 遵守字节范围请求并仅向项目客户端供给项目标指定字节。假设文件未缓存,或许文件过时,Nginx 会从原始办事器下载全部文件。

假设请求是针对单个字节范围的,则 Nginx 会鄙人载流中碰到该范围后急速将该范围发送到客户端。假设请求在同一文件中指定了多个字节范围,则 Nginx 会鄙人载完成时将全部文件传送到客户端。

下载完成后,Nginx 会将全部资本移动到缓存中,以便从缓存中急速满足一切将来的字节范围请求,不管是单个范围照样多个范围。

请留意,upstream 办事器必须支撑 Nginx 的字节范围请求,以支撑对该 upstream 办事器的字节范围请求。

Nginx 若何处理 Pragma 标头

在 Pragma:no-cache 报头由客户参加到绕过一切中心缓存,直接进入到源办事器的请求的内容。Pragma 默许情况下,Nginx 不支撑标头,但您可以应用以下 proxy_cache_bypass 指令设备该功能:

location /images/ { 
  proxy_cache my_cache; 
  proxy_cache_bypass $http_pragma; 
  # ... 
}

Nginx 能否支撑标头 stale-while-revalidate 和 stale-if-error 和扩大的 Cache-Control

Nginx 1.11.10 及更高版本中支撑。这些扩大做了甚么:

假设以后正在更新 stale-while-revalidate,Cache-Control HTTP 标头的扩大许可应用陈腐的缓存照应。HTTP 标头的 stale-if-error 扩大 Cache-Control 许可在产生缺点时应用陈腐的缓存照应。这些头具有比较低优先级, proxy_cache_use_stale 指令如上所述。

Nginx 能否支撑 Vary 标头

Nginx 1.7.7 和更高版本中是支撑 Vary 标头的 。

结论

至此,您应当很好地理解 Nginx 代理缓存的任务道理和若何精确设备 Nginx 代理缓存。假设您有任何成绩或反应,请随时发表评论。

以上就是本文的全部内容,欲望对大年夜家的进修有所赞助,也欲望大年夜家多多支撑我们。

本文标题: 18个运维必知的Nginx代理缓存设备技能(你都控制了哪些呢)
本文地址: http://yourctp.com/jiqiao/fuwuqi/277448.html

假设认为本文对您有所赞助请赞助本站

付出宝扫一扫赞助微信扫一扫赞助

  • 付出宝扫一扫赞助
  • 微信扫一扫赞助
  • 付出宝先领红包再赞助
    声明:凡注明"本站原创"的一切文字图片等材料,版权均属编程客栈一切,迎接转载,但务请注明出处。
    Zabbix 上Windows性能监控的办法Docker安排Tomcat及Web应用的完成
    Top