本文详细介绍了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配置和浏览流程,但最基本的配置通常无法满足您的业务流程需求,您通常会提出以下疑问和要求:
我们应该逐一处理上述疑问。
问题一:主动清空缓存
可选: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的大量信息,请搜索您以前的文章或再次访问下面的相关文章。期待你以后的申请!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)