技术积淀----NGINX缓存
off999 2025-01-13 16:48 22 浏览 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
相关推荐
-
- 解压软件rar下载(解压软件rar下载什么)
-
rar是一种文件压缩格式,可以把一个文件压缩到只有原来文件的几分之一大小。大大节省了存储空间。rar文件怎么打开呢,需要电脑上安装文件压缩软件,解压才能打开压缩包里的文件。WinRAR软件是用的最多的压缩软件,一般电脑装系统时都装了这个软件...
-
2026-01-12 04:51 off999
- 戴尔电脑官方售后服务网点(戴尔电脑官方售后地点)
-
戴尔笔记本电脑维修点有4个,地点如下:A:戴尔笔记本电脑维修点地址:上海市长宁区长宁路1027号兆丰广场5层B:戴尔笔记本电脑维修点地址:上海市徐汇区漕溪北路45号C:戴尔笔记本电脑维修点地址:上...
- 电脑哪个键是截图(苹果电脑哪个键是截图)
-
1.第一个,通过键盘上的截图键来截取全屏,键盘上都有一个printscreen键,这个键就是用来截图的,只需要按一下这个键,然后再打开word文档,然后按一下ctrl+v键,就可以把这个截图,粘贴...
-
- 下载设置到手机上(手机设置下载到桌面上)
-
1.打开手机的“设置”图标。2.进入设置页面,滑动手机屏幕,找到“桌面、锁屏与息屏”选项并点击。3.进入新页面,滑动手机屏幕找到“添加应用到主屏幕”选项,此时该选项右侧的按钮为关闭状态。4.点击一下“添加应用到主屏幕”选项右侧的按钮,按钮点...
-
2026-01-12 03:03 off999
- 如何连接打印机网络共享(打印机如何通过网络共享)
-
打印机设置共享打印的操作步骤一、在连接打印机的电脑上依次点击“开始“菜单-”设置“-”打印机“,打开打印机界面后右键单击“打印机”图标点击到“共享”选项界面接着点击“共享这台打印机”,最后点击“确定”...
- win10自带风扇控制软件(w10风扇管理在哪里)
-
在Windows10系统中,风扇的设置通常是由计算机硬件和BIOS控制的。但是,您也可以使用一些软件工具来调整风扇的设置。以下是一些常用的方法:1.使用BIOS设置:在计算机启动时按下相应的按键(...
- 系统类小说女主文(系统文推荐女主)
-
1、《团宠郡主有系统》2、《绑定才女系统后文躺赢了》 3、《炮灰女配苟成了女主》 4、《在暴君身边卑微求生》 5、《师徒恋文里的反派非要和我HE》6、《穿成反派男主极品娘...
- 视频下载网站免费(视频下载网站免费mp3)
-
1.ITunesMovieTrailers苹果的预告片库,库中影片的画质都很不错,基本上覆盖了当前的主流电影,以美国电影居多,国内的片子比较少,如果需要从中下载,那么下载时需要配合浏览器的资源嗅探...
-
- 电脑下划线符号怎么打(电脑上那个下划线怎么打)
-
1、下划线的输入方法为英文输入法状态下,Shift+“-”输入。2、上划线需要借助特殊的输入法或是直接使用Word插入符号,这里介绍Word方法,首先打开Word,然后点击“插入”。3、在插入栏内点击“符号”,弹出的菜单中点击“其它符号”。...
-
2026-01-12 00:03 off999
- win+f是什么快捷键(快捷键win+l是那个键)
-
Win+E:打开我的电脑Win+F:搜索文件Win+D:显示桌面Win+M:最小化所有窗口Win+Pause:显示系统属性对话框Win+L:锁定您的计算机或切换用户Win+R:打开运行对话...
- 搜狗浏览器app下载(搜狗浏览器app下载安卓版)
-
试试在地址栏右边切换浏览模式,改成兼容。ACTIVX插件是IE的专利,搜狗兼容模式是调用IE,高速模式是CHROME核心。在搜狗浏览器右上角菜单-工具-选项-查看下主页设置是否是你想要的。导航类以ht...
- 手机p图修改替换数字(手机截图怎么修改数字)
-
首先打开手机屏幕,在手机界面找到【美图秀秀】软件,点击打开进入,进入美图秀秀后,选择【图片美化】,在弹出的手机相册中,选择并打开所需截图;在下方选项中找到【消除笔】,放大截图,消除需要更改的数字,消...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
