1 服务端缓存原理

主要是缓存代理的后端服务器

proxy_cache 运用局部性的原理,备存一些先前被访问过、料将被再度使用的资源,使用户得以由前端服务器直接取得,从而减少后端服务器的资源开销,并缓解整个系统的压力。缓存也是反代的用途之一。本文介绍 Nginx 基本的缓存配置。

1.1 定义一个缓存目录

路径为 /usr/local/nginx/cache;采用二级的目录结构;建立一块用于存放缓存键 (cache keys) 和元数据 (metadata) 的共享内存区,名叫 “the_cache_zone” 且分配 10MB 的内存;不活跃的缓存文件 1 小时后将被清除;缓存所占磁盘空间的上限是 512MB;不另设临时目录。

http {
...
proxy_cache_path /tmp/my_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=500m;
#proxy_cache_path /tmp/my_cache levels=1:2 keys_zone=the_cache_zone:10m inactive=1h max_size=512m use_temp_path=off;
...
}

1.2 启用缓存

方便除错计,添加一响应头用以指示缓存状态 (MISS / BYPASS / HIT …)。

下列指令请斟酌——

proxy_cache_bypass 用于指定忽略缓存的情况,当其值为空或为零时,使用缓存。

proxy_cache_key 用于生成缓存键,区分不同的资源。要特别留心 Query String。

proxy_cache_min_uses 则规定缓存门槛,请求过多少次才缓存,不缓存低频请求,避免浪费。

在下例中,$is_args 反映请求的 URI 是否带参数(网址中问号后面那一长串),若没有即为空值。$request_uri 近似于 $uri$is_args$args。key 是决定缓存命中率的因素之一。

        location /es {
proxy_cache_key $request_uri;
add_header X-Cache-Status $upstream_cache_status;
proxy_cache cache_one;
proxy_cache_valid any 5m;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.2.222:9200/;
}
location / {
...
proxy_pass http://www.example.com; proxy_cache the_cache_zone;
# proxy_cache_bypass $is_args;
# (default) proxy_cache_key $scheme$proxy_host$request_uri;
# proxy_cache_min_uses 3; add_header X-Cache-Status $upstream_cache_status;
...
}

1.3 Nginx 作反代

nginx相对来说也是客户端若希望抓取的源站内容总是新鲜,还需要忽略上游的缓存期限,即不遵循源站的 Cache-ControlExpires 等响应头,然后再来配置自己的缓存期限。

服务端一侧,proxy_cache_valid 控制的是 expiration (有效期),针对不同的 HTTP 状态码可以设定不同的有效期。inactive 决定的是 retention (保留期限),时间一到管你新不新鲜都要丢掉 (refresh)。可以理解为 inactive 要优位于 proxy_cache_valid

proxy_cache_revalidate 将对客户端传来之 Etag 或 Last-Modified 作出验证,若服务端资源没有变化,则使用“稍早前”缓存页面,无论其有效期为何。有助减少回源次数。

location / {
...
proxy_ignore_headers X-Accel-Expires Cache-Control Expires; proxy_cache_valid 301 1h;
proxy_cache_valid 200 30m;
proxy_cache_valid any 1m;
proxy_cache_revalidate on;
...
}

1.4 缓存一时爽,全家火葬场。

一大波缓存同时失效,会导致缓存雪崩 (Cache stampede),使得大批请求涌向源站。如果网站不是特别大、并发要求不是特别高,可以采取加锁排队和暂时返回陈旧数据的方式缓解问题。但根本的还是要各别设定缓存期限,错峰更新缓存,不要一窝蜂。

proxy_cache_lock 对同一资源,未命中一次只回源一次,阻塞后续请求直至当前请求完成。

proxy_cache_lock_age “不能者止”,如果当前请求未能如期完成,就放行后续请求。

proxy_cache_lock_timeout 发生超时,同样放行,但不作缓存。

proxy_cache_use_stale 则是指定“共体时艰”的情境,比如服务器正在更新 (updating) 缓存的时候,或者遭遇 503 服务不可用错误的时候,勉予使用 (inactive 还未清理的) 过期缓存,以保持可用性。

proxy_cache_background_update 返回陈旧数据时,也跟源站要一份新鲜的,下次用。

location / {
...
proxy_cache_lock on;
# (default) proxy_cache_lock_age 5s;
# (default) proxy_cache_lock_timeout 5s; proxy_cache_use_stale error timeout updating http_503;
proxy_cache_background_update on;
...
}

1.5 ngx_cache_purge

倘若有手动清除缓存的需求,又用不起 NGINX Plus,不妨考虑 ngx_cache_purge

下载源码、nginx -V 检视参数、追加参数 --add-module=../ngx_cache_purge-2.3 且重新编译 Nginx,以完成添加模块的动作。

proxy_cache_purge 得回头看前面的配置,使用的缓存路径与 proxy_cache 的对应、缓存键向 proxy_cache_key 的看齐。URI 前面加上 /purge 即为清除缓存接口(最好不要被外部访问)。

location / {
...
proxy_cache the_cache_zone;
proxy_cache_key $scheme$proxy_host$request_uri;
...
} location ~ /purge(/.*) {
...
allow 127.0.0.1;
deny all;
proxy_cache_purge the_cache_zone $scheme$proxy_host$1$is_args$args;
...
}

nginx缓存加速笔记的更多相关文章

  1. Nginx使用Expires增加浏览器缓存加速(转)

    转载自:Nginx使用Expires增加浏览器缓存加速 Nginx可以更改HTTP头部,这个是Web服务器必须的,当然Nginx更可以支持在HTTP头部中添加Expires等相关信息,增强浏览器缓存, ...

  2. Linux实战教学笔记36:PHP服务缓存加速深度优化实践

    一,PHP缓存加速器介绍与环境准备 1.1 PHP缓存加速器介绍 1.1.1 操作码介绍及缓存原理 当客户端请求一个PHP程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码(Ope ...

  3. nginx缓存配置的操作记录梳理

    web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...

  4. Nginx缓存配置以及nginx ngx_cache_purge模块的使用

    web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...

  5. WDCP,LNMP安装PHP缓存加速扩展eAccelerator,xcache和memcached

    VPS主机性能配置如果太差,则在运行Wordpress博客和Discuz! 论坛等高消耗程序时能够明显感觉出VPS有些吃力.另外,即使VPS主机的CPU.内存.硬盘I/O等性能足够好,但是在面对大流量 ...

  6. PHP缓存加速插件 XCache 、 ZendOpcache 安装

    PHP缓存原理 当客户端请求一个PHP程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码(OperateCode,简称opcode)文件,该文件是PHP代码的一种二进制表示方式.默 ...

  7. NGINX 缓存使用指南

    NGINX 缓存使用指南 [proxy_cache] Nginx 一个web缓存坐落于客户端和“原始服务器(origin server)”中间,它保留了所有可见内容的拷贝.如果一个客户端请求的内容在缓 ...

  8. varnish实现缓存加速

    varnish实现缓存加速 一.采用varnish为nginx实现缓存加速1.实验环境:(1)一台varnish缓存服务器,一台nginx服务器(2)关闭防火墙和selinux2.配置varnish( ...

  9. php缓存加速优化--Xcache

    1.安装软件:cd /usr/local/src/下载软件包wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache- 3.2.0.tar.b ...

  10. 用Nginx搭建CDN服务器方法-开启Nginx缓存与镜像,自建图片服务器

    利用Nginx的proxy_cache搭建缓存服务器一:编译ngx_cache_purge1.Nginx的Proxy_cache是根据Key值md5哈希存储缓存,支持任意的Key,例如你可以根据”域名 ...

随机推荐

  1. Python 阿里云OSS文件上传下载与文件删除及检索示例

    阿里云OSS文件上传下载与文件删除及检索示例 实践环境 运行环境: Python 3.5.4 CentOS Linux release 7.4.1708 (Core)/Win10 需要安装以下类库: ...

  2. python学习总结(重要!!!)

    前取,后不取        index从0开始 list = [1,2,3,4,5,6,7,8,9]print(list[3:7]) #输出:[4, 5, 6, 7]print(list[3:-2]) ...

  3. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-59 - 判断元素是否显示 - 上篇

    1.简介 有些页面元素的生命周期如同流星一闪,昙花一现.我们也不知道这个元素在没在页面中出现过,为了捕获这一美好瞬间,让其成为永恒.我们就来判断元素是否显示出现过. 在操作元素之前,可以先判断元素的状 ...

  4. 进程的CPU绑定是否有意义 —— 进程的 CPU 亲和性

    好多年前就学习过 进程的 CPU 亲和性这个概念,说直白些就是CPU的进程绑定,也就是指定某个进程绑定到某个CPU核心上,以此提高进程切换时缓存的命中率,加快进程的运算速度. 虽然在编程的时候中会遇到 ...

  5. 预处理共轭梯度算法(Preconditioned Conjugate Gradients Method)

    预处理共轭梯度算法(Preconditioned Conjugate Gradients Method) 给出百度百科上的解释: 预处理共轭梯度法 预处理共轭梯度法是.不必预先估计参数等特点. 共轭梯 ...

  6. SemanticKernel/C#:实现接口,接入本地嵌入模型

    前言 本文通过Codeblaze.SemanticKernel这个项目,学习如何实现ITextEmbeddingGenerationService接口,接入本地嵌入模型. 项目地址:https://g ...

  7. 《最新出炉》系列小成篇-Python+Playwright自动化测试-67 - 模拟手机浏览器兼容性测试

    1.简介 在日常工作中,我们会遇到需要使用不同的硬件设备测试兼容性的问题,尤其是现在手机型号基本上是每个厂家每年发布一款新机型,而且手机的屏幕大小分辨率五花八门的,我们基本不可能全部机型都用真机测试一 ...

  8. Python按条件删除Excel表格数据的方法

      本文介绍基于Python语言,读取Excel表格文件,基于我们给定的规则,对其中的数据加以筛选,将不在指定数据范围内的数据剔除,保留符合我们需要的数据的方法.   首先,我们来明确一下本文的具体需 ...

  9. .NET 高效开发Nuget管理工具(开源)

    我们.NET开发会引用很多外部Nuget包,多项目.多个解决方案.甚至多个仓库. 简单的Nuget包管理,通过VS就能比较简单处理好.但复杂的场景呢,比如: 1.一个仓库里,有多个解决方案的Nuget ...

  10. 零基础学习人工智能—Python—Pytorch学习(八)

    前言 本文介绍卷积神经网络的上半部分. 其实,学习还是需要老师的,因为我自己写文章的时候,就会想当然,比如下面的滑动窗口,我就会想当然的认为所有人都能理解,而实际上,我们在学习的过程中之所以卡顿的点多 ...