缂撳瓨璁剧疆

缂撳瓨璁剧疆,第1张

nginxproxy_cache缓存配置详解

本文详细介绍了nginxproxy_cache的详细配置。原文根据示例代码非常详细,对大家的学习培训或者工作都有一定的参考价值。有必要的朋友陪我去了解一下。

序言:

因为自己的工作,涉及到网络直播平台行业,其中视频的审核和下载涉及到视频下载的一些技术方面。对于下载一个完整的视频,现阶段市场上流行的做法是将所有的rtmp协议切割成块,存储在文件服务器中。当客户不得不观看后面的视频时。根据一段视频回源网络服务器,去文件服务器请求一段一段的切下来,然后回去给客户播放视频。

今天主要讨论的是回源网络服务器缓存的配置及其有效的缓存对策。

以配置回源网络服务器缓存为例,详细说明了一套完整的缓存配置系统,并可以扩展到所有其他缓存配置场景。

今天的解读分为四点:

  • 返回源网络服务器的工作是什么,为什么?
  • 必须缓存备用源网络服务器。
  • 如何配置缓存
  • 如何为业务场景配置一个完美的缓存系统
  • 回到源网络服务器的工作:

    以下描述中一般指回网服务器:如下图所示,源站在cdn和文件服务器之间交叉,作为整个文档下载过程中的下载核心区。

    源站架构:源站是nginxphp的webserver架构,如下图:


    但是,如果源站只是简单地接收请求,然后下载资源,然后返回,就会出现以下无法改善的问题:

    1.cdn很可能有几种回源的情况。

    2.当源站多次下载相同的资源时,存在数据流量、网络带宽消耗和冗余时间。

    所以为了改善这个问题,必须给源站做一层缓存。缓存对策是nginx内置的proxy_cache控制模块。

    proxy_cache的基本原理:

    proxy_cache控制模块的原理如下图所示:


    如何配置proxy_cache控制模块

    将以下代码添加到nginx.conf文档中:

    http{ ...... proxy_cache_path/data/nginx/tmp-testlevels=1:2keys_zone=tmp-test:100minactive=7dmax_size=1000g; }

    代码表示:

    代理缓存路径缓存文件路径

    Levels设置缓存文件名级别;Levels=1:2表示二级文件目录。

    Keys_zone设置缓存名称和共享内存大小

    不活跃是在某个时间没人浏览的情况下删除的。

    如果ax_size较大的缓存空间空已满,默认设置将覆盖缓存时间最长的资源。

    配置完成后,重启nginx。如果没有错误,配置的proxy_cache将生效。

    查询proxy_cache_path/data/nginx/file目录,会发现tmp-test文件夹名形成。

    如何使用proxy_cache

    将以下代码添加到匹配的nginxvhost服务器配置文档中:

    location/tmp-test/{ proxy_cachetmp-test; proxy_cache_valid20020630430130210d; proxy_cache_key$uri; proxy_set_headerHost$host:$server_port; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_passhttp://127.0.0.1:8081/media_store.php/tmp-test/; }

    配置项详情:Proxy_cachetmp-test应用名为tmp-test的匹配缓存配置。

    proxy_cache_valid20020630430130210d;为200…的httpcode缓存10天。

    Proxy_cache_key$uri定义了缓存的唯一键,根据唯一键进行哈希存储。

    proxy_set_header定义http头并发送给后端开发realweb服务器。

    Proxy_pass是指代理后分享的方式。注意是否一定是final/

    至此,最基本的proxy_cache函数配置成功。当uri成功匹配到位置时,proxy_cache将生效。

    添加proxy_cache后,请求更改整个流程:

    1.首次浏览:


    在第一次浏览时,proxy_cache没有找到匹配的缓存文档(错过了缓存未命中),所以在第一次请求时,proxy_cache将维护缓存:

    2.存储缓存,如下图所示:


    3.第二次浏览同一个url时,当同一个文档再次到达源站时,proxy_cache会寻找其匹配的缓存文档(命中缓存命中)并立即返回给请求端,这样就不需要实现php程序流程了,如下图所示:


    明显提出质疑:

    至此,详细介绍了最基本的proxy_cache配置和浏览流程,但最基本的配置通常无法满足您的业务流程需求,您通常会提出以下疑问和要求:

  • 必须主动清除缓存文档。
  • 加载路径是硬盘。硬盘满了怎么办?
  • 如何让源站适合上传下载,上传下载的缓存对策。
  • 如果请求方范围请求(分块下载)一个具有相同uri的大型资源,如何区分这些请求?
  • 还必须通知请求者资源的到期时间。
  • 日志统计分析,如何配置命中和未命中字段名,如何做统计分析?
  • 我们应该逐一处理上述疑问。

    问题一:主动清空缓存

    可选:nginxproxy_cache_purge控制模块,与proxy_cache成对出现,效果相反。设计:在nginx中启动另一台服务器,在必须清空响应资源的缓存时,在这台设备上浏览这台服务器。例如,浏览127.0.0.1:8083/tmp-test/TL39F7ea6d8d48e87a30c43b8f75e30.txt以清除该资源的缓存文档。配置模式:

    location/tmp-test/{ allow127.0.0.1;//只容许该设备浏览 denyall;//严禁别的全部ip proxy_cache_purgetmp-test$uri;//清除缓存 }

    Proxy_cache_purge:缓存清除控制模块tmp-test:specifickey_zone$uri:specifickey-forming主参数proxy_cache_purge缓存清除的整个过程如下图所示:


    问题2:我的硬盘满是缓存的文档怎么办?

    因为加载路径是单个文件目录,所以只加载一个硬盘。硬盘很快就会被填满。有两种方法可以处理这个问题:

    1.有多少硬盘被用作磁盘阵列?缺陷:具体储空间减少。

    2.适当应用proxy_cache_path的文件目录结构,因为levels=1:2,导致缓存文档的文件目录结构是双层的,每层的目标目录都是由哈希函数构成的。如下图所示:


    总共有16*16*16=4096个文件名。对一级目录进行导电软连接,将0-f导电软连接连接到你需要的特定硬盘文件目录,如下图:


    按照软链的方式,完成:将不同磁盘中的文件目录作为真正的访问数据的方式,解决了使用多个磁盘,单个磁盘已满的问题。

    问题三:范围适用

    添加缓存代理后,移动客户端发出的范围请求可能无效,如下图所示:


    范围的主要参数不能传送到下一级,原因如下:

    当缓存代理向后端开发远程服务器共享http请求时,http头会发生变化,头中的一些主要参数会被取消。其中range的主要参数被取消,导致后端开发nginx网络服务器无法接收range的主要参数,最终导致块下载失败。因此,必须配置代理共享的标头。例如:

    location/tmp-test/{ proxy_cachetmp-test; proxy_cache_valid20020630430130210d; proxy_cache_key$uri; proxy_set_headerRange$http_range; proxy_passhttp://127.0.0.1:8081/media_store.php/tmp-test/; }

    红色部分的含义:将范围值($http_range)放在代理共享的http请求头中,作为主参数范围的值。

    问题4,应用范围负载时,必须重新配置proxy_cache_key:

    如果请求者范围请求(分块下载)具有相同uri的大型资源,代理缓存如何识别与资源匹配的键?因为nginx配置为:proxy_cache_key$uri,并且uri作为键使用,所以当请求是一般请求和范围请求时,所有相同的uri都作为键使用。Proxy_cache可能会导致不正确的返回。如下图所示:


    解决方法如下:更改proxy_cache_key,配置proxy_cache_key$http_range$uri;可以处理:键的唯一性。可以防止第一次获取的内容和以后获取的缓存内容难以发现异常,无论是全部正常请求还是不同范围的请求。

    问题5:如何配置-回到到期时间。

    必须根据返回到期时间指定客户端,哪些资源必须缓存,哪些资源不应该缓存。

    主参数 所有正常请求 范围请求 回到到期时间 回到 而不是回到

    为了更好地防止请求者将块资源缓存为明细资源,每个人都必须正常请求一切,并返回到期时间;对于范围请求,不要返回到到期时间。处理这个问题,可以根据nginx的配置来处理:

    location/media_store.php{ fastcgi_pass127.0.0.1:9000; fastcgi_indexmedia_store.php; fastcgi_paramSCRIPT_FILENAME$document_root/$fastcgi_script_name; includefastcgi_params; if($http_range=''){ expires2592000s; } }

    在proxy_pass之后的位置添加$http_range的解析,expires表示过期时间。2592000秒是指缓存过期时间。

    问题7:缓存命中状态如何在http头中反映,如何在nginx日志中查询

    解决方案:

    使用nginx$upstream_cache_status参数:该参数表示缓存命中,

    如果它命中,它就被命中;如果没打中,那就是失手。

    回到nginx服务器配置,添加:

    add_headerNginx-Cache"$upstream_Cache_status";

    将以下内容添加到nginxlog中:

    log_formatcombinedio…$upstream_cache_status;

    返回http头截图:


    ngxlog日志的屏幕截图:


    总结:

    这里详细介绍了一整套完善的缓存对策。该方案不仅完成了基本的缓存配置,还解决了具体场景应用中遇到的问题,如硬盘扩容、缓存清理、上传下载、缓存过期时间、缓存命中提醒等。如果这个方案掌握的很熟练,再复杂的场景,基础也能满足需求。以上都是我在工作中爬过的坑,逐步完善总结出来的结果,希望对读者有所帮助。

    关于nginxproxy_cache的详细配置,本文到此结束。有关nginxproxy_cache的大量信息,请搜索您以前的文章或再次访问下面的相关文章。期待你以后的申请!

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/774182.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存