Nginx 状态监控、缓存的两种机制(学习笔记十四)

简介: 这里 Cache 有两种情况说明,一种是浏览器访问Nginx,浏览器会Cache;一种是Nginx 访问后端,Nginx 自己Cache 。
img_dc7b057a75ec42719b9de3589ce4aa4c.png

这里 Cache 有两种情况说明,一种是浏览器访问Nginx,浏览器会Cache;一种是Nginx 访问后端,Nginx 自己Cache 。


第一种情况

来个例子:

$ curl -I http://www.12reads.cn

HTTP/1.1 200 OK

Server: JSP3/2.0.4

Date: Fri, 31 Oct 2014 07:28:20 GMT

Content-Type: text/css

Content-Length: 25076

Connection: keep-alive

ETag: “1121644245”

Last-Modified: Wed, 24 Sep 2014 15:50:22 GMT

Expires: Mon, 23 Mar 2015 16:29:25 GMT

Age: 3164335

Cache-Control: max-age=15552000

Accept-Ranges: bytes

Vary: Accept-Encoding

先多句嘴说说Date 和 Age 的意思,Date 的意思是服务器发送消息的时间; Age 的意思有点复杂,它的存在暗示你访问的服务器不是源服务器,而是一台缓存服务器,Age 的大小表示这个资源已经”存活了”多长时间,所以这个值不会大于 源服务器设置的最大缓存时间。

这里Expires 表示过期时间,Cache-Control 表示最大的存活时间,在服务器端的Nginx 我们可以用 expires 指令来定义这两项。

比如:

expire -1;

expire 0;

expire 1h;

expire max;

expire off;

这个指令表示在HTTP响应头中是否增加或修改Expires 和 Cache-Control ,仅当响应状态是200, 201, 204, 206, 301, 302, 303, 304, 或者 307的时候有效。

当expire 为负时,会在响应头增加Cache-Control: no-cache;

当为正或者0时,就表示Cache-Control: max-age=指定的时间(秒);

当为max时,会把Expires设置为 “Thu, 31 Dec 2037 23:55:55 GMT”, Cache-Control 设置到 10 年;

当为off时,表示不增加或修改Expires 和 Cache-Control 。


另外,浏览器可以通过两种方式来判断缓存文件是否被更新了,一种是 If-Modified-Since ,浏览器通过发送If-Modified-Since 头,带上「上一次请求获得的修改时间,(在Last-Modified头里)」发送到服务器,服务器会判断这个时间之后文件有没有改变,如果没有改变返回状态值304,如果有返回新文件,状态值200 。

还有一种是利用Etag(Entity Tag),它是实体内容的hash字符串(md5或者SHA1的算法计算出来的),这个方法更准确但是更消耗服务器的CPU,浏览器发送If-None-Match 头,里面是Etag值(浏览器之前请求文件时,服务器会返回Etag 头),服务器收到后做比较,如果一样就返回304,不一样也发送最新文件,返回值200。(本文由管理学书籍http://www.12reads.cn/ 原创)


第二种情况

 一般先在http 里面定义一个缓存路径:

[text]

proxy_buffering on;

proxy_cache_path $cache_path/m_wdjcdn_com levels=1:2 keys_zone=m_wdjcdn_com:512m inactive=20d max_size=300G;

[/text]

然后在server 的 location 里来使用缓存,比如:

[text]

proxy_cache m_wdjcdn_com;

proxy_cache_key "$scheme$host$request_uri";

proxy_cache_valid 200 301 302 20m;

proxy_cache_valid 404 1m;

proxy_cache_use_stale error timeout invalid_header updating;

proxy_cache_min_uses 1;

proxy_cache_revalidate on;

[/text]

要注意,proxy_cache在proxy_buffering 开启之后才有效,否则不会缓存。

proxy_cache_path 的levels 定义目录层次结构;inactive 表示数据没被访问多长时间后从缓存中删除;缓存大小超过max_size之后使用LRU算法删除数据。

proxy_cache 定义使用哪个zone;

proxy_cache_key 定义缓存key;

proxy_cache_valid 不同状态码缓存不同时间;

proxy_cache_use_stale 定义后端服务器在何种情况下Nginx 返回过期的缓存;

proxy_cache_min_uses 请求多少次之后才会被缓存;

proxy_cache_revalidate 表示资源过期后是否使用If-Modified-Since 和If-None-Match来确认资源是否改变。

另外,还有一个指令 proxy_cache_purge,它用于清除缓存,比如下面的配置:

[text]location ~ /purge(/.*) {

proxy_cache_purge m_wdjcdn_com ""$scheme$host$1";

}[/text]

如果访问/purge/nosa.png,就把nosa.png的缓存清除了,这个功能可用于刷新缓存。


最后再看下关于 proxy_cache_use_stale 的官方解释:

This directive tells Nginx when to serve a stale item from the proxy cache. The parameters for this directive are similar to proxy_next_upstream with the addition of ‘updating’.

To prevent cache stampedes (when multiple threads stampede in to try to update the cache simultaneously) you can specify the ‘updating‘ parameter. This will cause one thread to update the cache and while the update is in progress all other threads will serve the stale version of what is in the cache.

目录
相关文章
|
1月前
|
缓存 Java 数据库连接
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
文章介绍了MyBatis的缓存机制,包括一级缓存和二级缓存的配置和使用,以及如何整合第三方缓存EHCache。详细解释了一级缓存的生命周期、二级缓存的开启条件和配置属性,以及如何通过ehcache.xml配置文件和logback.xml日志配置文件来实现EHCache的整合。
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
|
2月前
|
缓存 应用服务中间件 nginx
成功解决 Nginx更新静态资源无效 ,Nginx静态资源更新不及时,Nginx清除缓存
这篇文章讨论了在使用Nginx进行动静分离时遇到的静态资源更新不及时的问题。问题描述了在服务器上更新静态资源后,访问页面时页面没有显示更新的情况。文章提供了解决这个问题的方法,即清除浏览器缓存,并提供了相关参考文章链接。此外,还展示了问题复现的步骤和正常情况的预期结果。
成功解决 Nginx更新静态资源无效 ,Nginx静态资源更新不及时,Nginx清除缓存
|
2月前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
202 1
|
15天前
|
存储 缓存 监控
|
15天前
|
存储 缓存 负载均衡
Nginx代理缓存机制
【10月更文挑战第2天】
43 4
|
14天前
|
存储 缓存 NoSQL
Nginx缓存
Nginx缓存
25 1
|
18天前
|
存储 缓存 NoSQL
深入理解后端缓存机制的重要性与实践
本文将探讨在后端开发中缓存机制的应用及其重要性。缓存,作为提高系统性能和用户体验的关键技术,对于后端开发来说至关重要。通过减少数据库访问次数和缩短响应时间,缓存可以显著提升应用程序的性能。本文将从缓存的基本概念入手,介绍常见的缓存策略和实现方式,并通过实例展示如何在后端开发中有效应用缓存技术。最后,我们将讨论缓存带来的一些挑战及其解决方案,帮助您在实际项目中更好地利用缓存机制。
|
1月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
56 8
消息中间件 缓存 监控
93 0
|
1月前
|
缓存 Java Python
python垃圾回收&缓存机制
python垃圾回收&缓存机制