Nginx内容缓存怎么配置及常见参数配置有哪些

发布时间 - 2023-05-11 00:00:00    点击率:

使用场景:

项目的页面需要加载很多数据,也不是经常变化的,不涉及个性化定制,为每次请求去动态生成数据,性能比不上根据请求路由和参数缓存一下结果,使用 nginx 缓存将大幅度提升请求速度。

基础

只需要配置 proxy_cache_path 和 proxy_cache 就可以开启内容缓存,前者用来设置缓存的路径和配置,后者用来启用缓存。

http {
 ...
 proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

 server {
 proxy_cache mycache;
 location / {
  proxy_pass http://localhost:8000;
 }
 }
}

对应参数说明:

1.用于缓存的本地磁盘目录是 /path/to/cache/

2.levels 在 /path/to/cache/ 设置了一个两级层次结构的目录。将大量的文件放置在单个目录中会导致文件访问缓慢,所以针对大多数部署,我们推荐使用两级目录层次结构。如果 levels 参数没有配置,则 nginx 会将所有的文件放到同一个目录中。

3.keys_zone 设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。将键的拷贝放入内存可以使 nginx 在不检索磁盘的情况下快速决定一个请求是 hit 还是 miss,这样大大提高了检索速度。一个 1mb 的内存空间可以存储大约 8000 个 key,那么上面配置的 10mb 内存空间可以存储差不多 80000 个key。

4.max_size 设置了缓存的上限(在上面的例子中是 10g)。这是一个可选项;如果不指定具体值,那就是允许缓存不断增长,占用所有可用的磁盘空间。当缓存达到这个上线,处理器便调用 cache manager 来移除最近最少被使用的文件,这样把缓存的空间降低至这个限制之下。

5.inactive 指定了项目在不被访问的情况下能够在内存中保持的时间。在上面的例子中,如果一个文件在 60 分钟之内没有被请求,则缓存管理将会自动将其在内存中删除,不管该文件是否过期。该参数默认值为 10 分钟(10m)。注意,非活动内容有别于过期内容。nginx 不会自动删除由缓存控制头部指定的过期内容(本例中cache-control:max-age=120)。过期内容只有在 inactive 指定时间内没有被访问的情况下才会被删除。如果过期内容被访问了,那么 nginx 就会将其从原服务器上刷新,并更新对应的 inactive 计时器。

6.nginx 最初会将注定写入缓存的文件先放入一个临时存储区域, use_temp_path=off 命令指示 nginx 将在缓存这些文件时将它们写入同一个目录下。我们强烈建议你将参数设置为 off 来避免在文件系统中不必要的数据拷贝。use_temp_path 在 nginx1.7 版本和 nginx plus r6 中有所介绍。

最终,proxy_cache 命令启动缓存那些 url 与 location 部分匹配的内容(本例中,为/)。你同样可以将 proxy_cache 命令添加到 server 部分,这将会将缓存应用到所有的那些 location 中未指定自己的 proxy_cache 命令的服务中。

nginx 缓存相关进程

缓存中还涉及两个额外的nginx进程:

  • cache manager 周期性地启动,检查高速缓存的状态。如果高速缓存大小超过 proxy_cache_path 中 max_size 参数设置的限制,则高速缓存管理器将删除最近访问过的数据。在两次缓存管理器启动的间隔,缓存的数据量可能短暂超过配置的大小。

  • cache loader 只运行一次,nginx 开始之后。它将有关以前缓存的数据的元数据加载到共享内存区域。一次加载整个缓存可能会消耗足够的资源来在启动后的最初几分钟内降低 nginx 的性能。要避免这种情况,请通过在 proxy_cache_path 指令中包含以下参数来配置缓存的迭代加载:

    • loader_threshold - 迭代持续时间,以毫秒为单位(默认情况下 200)

    • loader_files - 一次迭代期间加载的最大项目数(默认情况下 100)

    • loader_sleeps - 迭代之间的延迟,以毫秒为单位(默认情况下 50)

在以下示例中,迭代持续数300 毫秒或直到 200 个项目被加载进去:

proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;

其他常用参数

配置示例:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
 ...
 location / {
  proxy_cache my_cache;
  # proxy_cache_key "$host$request_uri$cookie_user";   proxy_cache_min_uses 3;
  proxy_cache_methods get head post;
  proxy_cache_valid 200 302 10m;
  proxy_cache_valid 404  1m;
  # proxy_cache_valid any 5m;   proxy_pass http://localhost:8000;
 }
}

对应参数说明:

  • proxy_cache_key 为更改计算密钥时使用的请求特征,指定缓存的 key,这个不推荐,示例是使用域名,请求url,用户 cookie 来当作 key,意味着一个页面将为不同的用户缓存 n 次,绝大多数情况不需要这样的操作。

  • proxy_cache_min_uses 为在缓存响应之前必须使用相同密钥的请求的最小次数。

  • proxy_cache_methods 为指定要被缓存的请求方式的响应值,默认为 get 和 head,新增其他的需要一起列出来,如上示例所示。

  • proxy_cache_valid 为响应状态码的缓存时间,示例可以为每个状态码缓存指定时间,也可以使用 any 进行全部状态码的缓存。

清除缓存

需要提前加一个配置,用于标识使用 http purge 方法的请求并删除匹配的 url 对应的缓存。

1.在 http {} 上下文中创建新变量,例如 $purge_method, 他依赖于 $request_method 变量:

http {
 ...
 map $request_method $purge_method {
  purge 1;
  default 0;
 }
}

2.在 location {} 块中,已经配置缓存的前提下,引入 proxy_cache_purge 参数来指定清除缓存请求的条件。例如在上一步指定的 $request_method

server {
 listen  80;
 server_name www.example.com;

 location / {
  proxy_pass https://localhost:8002;
  proxy_cache mycache;

  proxy_cache_purge $purge_method;
 }
}

配置完并使之生效之后,就可以发送一条 purge 请求来让缓存失效了,例如:

curl -x purge -d – https://www.example.com/*

在该示例中,将清除具有公共 url 部分(由星号通配符指定)的资源。但这些缓存条目不会从缓存中完全删除:它们会保留在磁盘上,直到它们被视为不活动(由proxy_cache_path 中的 inactive参数决定)的时候才完全删除,或缓存清除器(由 proxy_cache_path 中的 purge 决定),或客户端尝试访问它们的时候。


# nginx  # 情况下  # 加载  # 迭代  # 会将  # 计时器  # 将其  # 高速缓存  # 管理器  # 在上面  # 两级 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  php json中文编码为null的解决办法  Laravel如何使用Gate和Policy进行授权?(权限控制)  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  如何快速查询网站的真实建站时间?  香港服务器租用费用高吗?如何避免常见误区?  JavaScript如何实现错误处理_try...catch如何捕获异常?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  如何正确下载安装西数主机建站助手?  Laravel如何处理和验证JSON类型的数据库字段  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  微信小程序 HTTPS报错整理常见问题及解决方案  ,网页ppt怎么弄成自己的ppt?  太平洋网站制作公司,网络用语太平洋是什么意思?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何在建站之星绑定自定义域名?  如何快速建站并高效导出源代码?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  Laravel如何实现用户密码重置功能?(完整流程代码)  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  如何在云主机上快速搭建多站点网站?  Bootstrap整体框架之JavaScript插件架构  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何用花生壳三步快速搭建专属网站?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  如何做网站制作流程,*游戏网站怎么搭建?  Python并发异常传播_错误处理解析【教程】  使用Dockerfile构建java web环境  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  制作公司内部网站有哪些,内网如何建网站?  再谈Python中的字符串与字符编码(推荐)  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何快速生成可下载的建站源码工具?  canvas 画布在主流浏览器中的尺寸限制详细介绍  JavaScript实现Fly Bird小游戏  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  个人网站制作流程图片大全,个人网站如何注销?  中山网站推广排名,中山信息港登录入口?