百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

技术积淀----NGINX缓存

off999 2025-01-13 16:48 28 浏览 0 评论

整洁的代码,合理的架构是一个性能卓越的应用不可或缺的优点。同时在很多案例中,开发者投入一些精力在一些最基本的技术上,也可以带来非常大的性能提升。这些基础的技术包括就包括缓存技术。本文主要介绍下如何利用NGINX缓存提升系统性能。

nginx常常被当做反向代理、负载均衡器。同时nginx还具备强大的缓存特性,接下来我们将介绍如何配置nginx缓存。


如何配置最基础的缓存。

使用最基本的缓存功能,只需要两个NGINX指令:proxy_cache_path 和 proxy_cache。 proxy_cache_path 指令设置缓存路径和一些缓存配置,proxy_cache 指令用来使用NGINX缓存。



proxy_cache_path 指令包含下面这些配置:

/path/to/cache/ 指定缓存存放的磁盘目录。

levels=1:2 设置缓存存放的目录结构为两级,这个也是官方推荐的设置。设置默认是一级目录结构,实验表明在大量缓存文件被频繁读取的场景,文件读取性能会降低。

keys_zone 设置一个共享的区域,用来存放缓存的key以及元数据,用来计算定时,缓存是不是命中等信息。1M的共享区域可以存储大约8000个key,本例子设置的10M,大约可以存储8万个key。

max_size 设置允许nginx缓存使用的最大磁盘空间,比如本例子中允许使用的最大空间是10G,如果不设置,表示允许使用所有的磁盘空间。如果缓存占用达到了设置的上限,缓存管理器会自动移除最近最少使用的数据。

inactive 指定一个缓存项最大多长时间,不被使用将被删除。本例子中设置的是60m,表示如果一个缓存项,超过60分钟没有被再次请求,那么缓存管理器会自动删除此缓存,不管缓存是不是过期。inactive 内容和缓存过期(Expired)是两个不同的概念。Nginx不会自动删除缓存过期的内容,Expired (stale)内容只会在Inactive时间到了后,才会被缓存管理器删除。

use_temp_path 官方推荐设置为off,用来改变nginx默认首次缓存文件被写入临时文件。设置为off后,缓存文件将不会先写入临时文件,然后后续移动到缓存目录,避免缓存文件被copy带来的系统开销。

最后proxy_cache 指令用来控制如何使用nginx缓存,如上面例子,请求满足配置规则进入location,请求到的内容将会被缓存。

proxy_cache 也可以在直接在server指令的作用域设置,如果location没有设置proxy_cache,那么将直接使用server的缓存设置。


NGINX中缓存的key是什么格式?

nginx默认的缓存key 是$scheme$proxy_host$request_uri,然后做MD5 hash。$schema是nginx内置的变量,表示http 或者https。$proxy_host,$request_uri如何理解,请看下面的例子。


http://www.example.org/my_image.jpg请求对于上面的配置,缓存key就应该是md5(“http://my_upstream:80/my_image.jpg”)。

大家注意到$proxy_host被用在了生成缓存key。$proxy_host如何理解呢?location中proxy_pass指令指定的名字和端口,端口默认是80。

同时nginx缓存也支持,用户自定义缓存的key,可以通过proxy_cache_key 进行设置,比如proxy_cache_key $uri$is_args$args;

ps: $is_args 代表请求中的 ?


如何指定缓存过期时间?

要理清楚此问题,首先需要了解http请求,是如何控制缓存的以及如何校验缓存是不是失效。

缓存控制大家最常见到的是Pragma,Cache-Control,Expires关键字。

http不同的版本控制缓存方式是不一样的,我们先讲http1.0,1.0时代控制比较简单:Pragma: no-cache时,表示禁用缓存,Expires的值是一个GMT时间,表示该缓存的有效时间,但是实际使用的时候,本地时间和服务器时间可能不一致。

http1.1通过Cache-Control来控制缓存。使用Last-Modified,或者etag来校验缓存。

首先讲一下Last-Modified。服务端在返回资源时,会将该资源的最后更改时间通过Last-Modified字段返回给客户端。客户端下次请求时通过If-Modified-Since或者If-Unmodified-Since带上Last-Modified,服务端检查该时间是否与服务器的最后修改时间一致:如果一致,则返回304状态码,不返回资源;如果不一致则返回200和修改后的资源,并带上新的时间,如下图:



单纯的以修改时间来判断还是有缺陷,比如文件的最后修改时间变了,但内容没变。对于这样的情况,我们可以使用etag来处理。

etag的方式是这样:服务器通过某个算法对资源进行计算,取得一串值(类似于文件的md5值),之后将该值通过etag返回给客户端,客户端下次请求时通过If-None-Match或If-Match带上该值,服务器对该值进行对比校验:如果一致则不要返回资源。

If-None-Match和If-Match的区别是:

If-None-Match:告诉服务器如果一致,返回状态码304,不一致则返回资源

If-Match:告诉服务器如果不一致,返回状态码412

如上http1.0、http1.1现在的http2.0,一些开发为了兼容复杂的环境,索性代码中一并兼容。

nginx默认不支持http1.0。如果要NGINX识别Pragma。开发者需要额外配置。

nginx默认支持是1.1的缓存控制,如果请求响应Cache-Control设置为Private, No-Cache, or No-Store 或者携带 cookie,nginx默认行为是不会缓存结果的。同时GET,HEAD请求才有可能被缓存。

服务器端可以Cache-Control:max-age=xxx (xxx is numeric),开控制缓存的过期时间。


NGINX 可以改变缓存Cache-Control的行为吗?



如上截图,nginx通过proxy_ignore_headers 指令可以忽略Cache-Control头部,强行设置缓存有效期是30分钟。如果没有设置有效期,nginx默认行为是不会缓存内容的。

缓存失效后,如何控制并发更新?

nginx提供了proxy_cache_lock 指令,这个指令打开后,如果并发请求未命中缓存(MISS),只允许一个请求到后端请求结果,其他请求等待结果,从缓存中拿数据。这个相当于一个分布式锁。在高并发场景非常有用。如果没有设置的话,多个请求都会直接回源到后端。

proxy_cache_lock_age、proxy_cache_lock_timeout 可以进一步控制锁的行为。

缓存失效后,如果触发自动更新?



如上面截图,proxy_cache_use_stale指令中增加updating,同时proxy_cache_background_update 设置为on,当一个请求 返现缓存是过期的内容或者缓存正在被更新过程中,那么此时会先返回给客户端一个过期的内容,同时后台会自动更新缓存。

缓存未失效,如何手动越过缓存直接回源?

这样的场景,我理解可能有两种,一种是想验证下缓存是不是正确,第二种场景强制手动更新缓存。可以通过nginx缓存提供的proxy_cache_bypass指令来实现。



proxy_cache_bypass告诉nginx缓存,如果请求参数或者cookie中有nocache,那么请求将回源到后端服务,而不是优先从缓存中取,请求之后的结果会被再次缓存。如下面这个请求http://www.example.com/?nocache=true。

如何统计缓存命中率?

nginx内置的变量 $upstream_cache_status,可以获得缓存的使用情况,开发可以将此状态打在日志中,或者增加到http头部,此变量可能有的取值,MISS, BYPASS, EXPIRED, STALE, UPDATING, REVALIDATED, HIT。统计请求中缓存状态,就可以知道缓存使用情况。

后端服务挂了,服务如何降级?

nginx缓存功能一大特点是当后端服务不能正常响应的时候,比如服务挂了,或者出现临时出现毛刺,可以通过配置服务降级,直接从缓存中取出内容,尽管此时缓存中的内容,已经不是最新值。在某些场景下,服务降级比服务直接挂了,会带来更好的用户体验。

proxy_cache_use_stale 指令可以设置服务出现问题后缓存的表现。



和上面同样的配置,只是额外增加proxy_cache_use_stale 指令,如果nginx收到后端服务error,timeout,或者500,502,503,504响应的时候,缓存虽然已经过期,但是还没有被缓存缓存管理器删除,那么此时nginx就可以直接给用户返回已经过期的内容。



参考:

https://my.oschina.net/u/1024333/blog/495780

https://blog.csdn.net/u012375924/article/details/82806617

相关推荐

安全教育登录入口平台(安全教育登录入口平台官网)

122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

2026-02-04 09:03 off999

电信宽带测速官网入口(电信宽带测速官网入口app)

这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

2025世界杯赛程表(2025世界杯在哪个国家)

2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

下载搜狐视频电视剧(搜狐电视剧下载安装)

搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

取消回复欢迎 发表评论: