一、缓存类型

1、服务端缓存

2、代理缓存

3、客户端缓存

4、代理缓存的工作流程:

二、代理缓存配置语法

1、代理缓存路径

配置语法

Syntax:    proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default:    —
Context:    http

定义缓存目录空间大小和名字。

可参考 http_proxy_module中proxy_cache官网文档:Module ngx_http_proxy_module

2、配置代理缓存

配置语法:

Syntax:    proxy_cache zone | off;
Default:
proxy_cache off;
Context:    http, server, location

 zone : 就是上一步所配置的 proxy_cache_path 中 path 的名字。表示缓存存入哪个路径。

3、缓存过期时间

配置语法:

Syntax:    proxy_cache_valid [code ...] time;
Default:    —
Context:    http, server, location

code : http 状态码。

例如配置 proxy_cache_valid 200 12h 意思是状态码为 200 的 缓存 12个小时。

4、缓存的维度

Syntax:    proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
proxy_cache_key $scheme$proxy_host$request_uri : http协议 + 主机名 + uri 把这三个作为一个单独的key来缓存。

如何还需要缓存别的,就按照这种格式来设置。

示例:

a、负载均衡缓存服务配置(/etc/nginx/conf.d/cache_test.conf)如下:

upstream chrdai {server 192.168.0.133:8001;server 192.168.0.133:8002;server 192.168.0.133:8003;
}proxy_cache_path /opt/app/cache levels=1:2 keys_zone=chrdai_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {listen       80;server_name  localhost;#charset koi8-r;#access_log  /var/log/nginx/host.access.log  main;location / {       proxy_cache chrdai_cache;proxy_pass http://chrdai;proxy_cache_valid 200 304 12h;proxy_cache_valid any 10m;proxy_cache_key $host$uri$is_args$args;add_header Nginx-Cache "$upstream_cache_status"; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;include conf.d/proxy_params; //proxy_params请参考我上一章的内容}
}

配置说明:

proxy_cache_path /opt/app/cache

存放缓存文件的目录

levels=1:2

目录分级,按照两层目录的方式来进行分级。

keys_zone=chrdai_cache:10m

zone空间的名字,后面配置 proxy_cache 后面配的就是这个名字。10m表示开辟key空间的大小,一般1m大概能存放8000个key。

max_size=10g

表示缓存目录最大是多大,不能让缓存无限增长占满整个磁盘。当缓存空间满了后,Nginx就会触发淘汰规则,把不常访问的就会淘汰掉。

inactive=60m

这个60m是时间单位,表示60分钟,表示如果在60分钟内如果某个缓存没有被访问过,就会把它清理掉。

use_temp_path=off

这个是用来存放临时文件的,建议关闭,如果打开的话,Nginx会另外建立一个目录和cache目录两个目录在更新缓存时容易出现一些性能方面的损耗。

proxy_cache chrdai_cache

表示我们已经开启了代理缓存,该值是proxy_cache_path中的 keys_zone 的值,如果不想使用代理缓存,将该值配置成 off。

proxy_pass http://chrdai

代理的地址

proxy_cache_valid 200 304 12h;

状态码为200,304的响应过期时间为 12h。

proxy_cache_valid any 10m;

除了200和304状态码的其它状态码的缓存时间为10分钟。

proxy_cache_key $host$uri$is_args$args;

设置默认缓存的key。

$is_args表示请求中的URL是否带参数,如果带参数,$is_args值为"?"。如果不带参数,则是空字符串。

$args表示HTTP请求中的参数。

add_header Nginx-Cache "$upstream_cache_status";

增加一个http响应头信息,Nginx-Cache,告诉客户端是否已经命中代理缓存。

proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

当我们的后端其中一台服务器出现错误,超时,或者500,502,503,504等不正常的头返回时,就跳过这一台,去访问下一台。避免因为单台服务器的异常对前端产生影响。

b、 另外三台真实服务器的配置如下:

第一台(/etc/nginx/conf.d/realserver1.conf):

第二台(/etc/nginx/conf.d/realserver2.conf):

第三台(/etc/nginx/conf.d/realserver3.conf):

c、分别在三台真实服务器(当然我这里是在一台服务器中用三个端口模拟的)的项目目录下建立index.html文件。

第一台(/opt/app/code1):

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>proxy_cache test</title>
</head>
<body><p>Test proxy_cache1</p>
</body>
</html>

第二台(/opt/app/code2):

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>proxy_cache test</title>
</head>
<body><p>Test proxy_cache2</p>
</body>
</html>

第三台(/opt/app/code3):

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>proxy_cache test</title>
</head>
<body><p>Test proxy_cache3</p>
</body>
</html>

c、先在代理服务器中将缓存关闭 (proxy_cache off),刷新页面,发现页面可以在三个站点间轮询显示。‘

d、然后在把代理缓存打开,发现页面不在轮询了,请求头多了缓存头(这是头我们配置的)。

刷新第一遍的时候,请求头 Nginx-Cache : MISS

第二遍刷新的时候就命中了代理缓存。

同时也会在我们配置的缓存目录(/opt/app/cache)生成缓存目录

三、清理指定缓存

方法一

m -rf 缓存目录内容

这样会把所有的缓存都给清空掉。

方法二

第三方拓展模块 ngx_cache_purge

四、如何让部分页面不缓存

配置语法

Syntax:proxy_no_cache string...;
Default:-;
Context:http,server,location;

配置示例:

upstream chrdai {server 192.168.0.133:8001;server 192.168.0.133:8002;server 192.168.0.133:8003;
}proxy_cache_path /opt/app/cache levels=1:2 keys_zone=chrdai_cache:10m max_size=10g inactive=60m use_temp_path=off;server {listen       80;server_name  localhost;#charset koi8-r;#access_log  /var/log/nginx/host.access.log  main;if ($request_uri ~ ^/(index.html|login|register|password|\/reset)) {set $cookie_nocache 1;}location / {proxy_cache chrdai_cache;proxy_pass http://chrdai;proxy_cache_valid 200 304 12h;proxy_cache_valid any 10m;proxy_cache_key $host$uri$is_args$args;proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;proxy_no_cache $http_pragma $http_authorization;add_header Nginx-Cache "$upstream_cache_status";proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;include conf.d/proxy_params;}
}

这里配置的意思就是当url中匹配到了 index.html , login, register, password 和 reset 时,不缓存该url所对应的页面。

五、缓存命中分析

方式一

通过设置 response 的头信息 Nginx-Cache

add_header Nginx-Cache "$upstream_cache_status";

方式二

通过设置 log_format,打印日志进行分析。(打印 $upstream_cache_status 这个Nginx默认的变量)

$upstream_cache_status 这个变量有以下几种值:

状态 含义
MISS 未命中,请求被传送到后台处理
HIT 缓存命中
EXPIRED 缓存已经过期,请求被传送到后台处理
UPDATING 正在更新缓存,将使用旧的应答
STALE 后端得到过期的应答

缓存命中率 = HIT次数 / 总请求次数。

示例:

首先在 /etc/nginx/nginx.conf 中的 logformat 中加入 $upstream_cache_status 这个变量。

然后配置缓存代理的 access_log 的路径

然后使用linux 的awk 命分析日志 。

awk '{if($NF=="\"HIT\""){hit++}}END{printf "%.2f", hit/NR}' /var/log/nginx/proxy_cache_access.log

命令解释:

$NF :  日志每行的最后一个参数。

hit我们自定义的一个变量,用来记录被命中的次数。

NR:AWK的内置变量,表示本次分析所扫描日志的总行数。

命令执行结果:

说明我们的缓存命中率为 58%。

六、大文件的分片请求

http_slice_module

配置语法

Syntax:slice size;
Default:slice 0;
Context:http,server,location;

size 是一个大小,表示是大文件被分割后,小文件的大小。

实现原理

会根据 Range 的值分割成小的请求去请求后端,返回回来的就是一个一个小的缓存文件,

优势:

每个子请求收到的数据都会形成一个独立文件,一个请求断了,其它请求不受影响。

缺点:

当文件很大或者 slice 很小的时候,可能会导致文件描述符耗尽等情况。

nginx 缓存配置详解都是干货相关推荐

  1. Nginx缓存配置详解

    配置缓存 缓存可以非常有效的提升性能,因此不论是客户端(浏览器),还是代理服务器( Nginx ),乃至上游服务器都多少会涉及到缓存.可见缓存在每个环节都是非常重要的.下面让我们来学习 Nginx 中 ...

  2. 运维配置:Nginx日志配置详解

    Nginx日志配置详解 前言 Nginx日志对于统计.系统服务排错很有用.Nginx日志主要分为两种:access_log(访问日志)和error_log(错误日志).通过访问日志我们可以得到用户的I ...

  3. nginx.conf配置详解

    ######Nginx配置文件nginx.conf中文详解######定义Nginx运行的用户和用户组 user www www;#nginx进程数,建议设置为等于CPU总核心数. worker_pr ...

  4. OKHTTP之缓存配置详解

    前言 在Android开发中我们经常要进行各种网络访问,比如查看各类新闻.查看各种图片.但有一种情形就是我们每次重复发送的网络请求其实返回的内容都是一样的.比如一个电影类APP,每一次向服务器申请某个 ...

  5. Nginx的配置详解

    人无再少年,花有重开日--风城玫瑰 德里克·罗斯 Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡. Ngin ...

  6. CentOs8安装、CentOs8中文拼音输入法安装、Nginx安装配置详解

    文章目录 CentOs8安装配置 CentOs8安装中文拼音输入法 CentOs8快捷键设置 CentOs8 Nginx安装 1.安装gcc 2.pcre.pcre-devel安装 3.zlib安装 ...

  7. Nginx 缓存机制详解!

    点击关注公众号,回复"1024"获取2TB学习资源! Nginx 缓存作为性能优化的一个重要手段,可以极大减轻后端服务器的负载.下面我们将介绍 Nginx 缓存配置的相关指令以及 ...

  8. nginx常用配置详解

    一.nginx配置文件结构: ... #全局块 events { #events块 ...} http #http块{ ... #http全局块 server #server块 { ... #serv ...

  9. [转]nginx常见配置详解

    一.nginx的配置文件 配置文件默认为安装目录下的conf/nginx.conf,如果有使用到其他子配置文件,可以在nginx.conf中使用include 文件路径;的方式加载使用,比如serve ...

最新文章

  1. 分享Silverlight/WPF/Windows Phone一周学习导读(10月1日-10月15日)
  2. jdk历史各个版本下载
  3. 今年的校招,Java好拿offer吗?
  4. WordPress.com 开源,弃 PHP 改用 JavaScript
  5. 个人或者企业怎么进行app开发?开发一款APP应用大概须要多少钱?
  6. mysql isam 食物_MySQL常用存储引擎之MyISAM
  7. [react] 为什么说React中的props是只读的?
  8. 安卓音频处理相关资料集合贴
  9. 圆周率π的近似计算(三)-MapReduce分布式计算入门
  10. 台电推出疾霆系列高端NVMe SSD,搭载联芸全新主控高速级读写
  11. 将加密的ppt文档解密,使之可以编辑
  12. 视觉培训2 机器学习基础知识学习
  13. 行业专网对比公网,优势在哪儿?能满足什么特定要求?
  14. 气象局天气预报信息接口实现
  15. 地铁和轻轨的区别, 中国目前有几个城市有地铁
  16. 北京市乡镇界街道shp数据arcgis软件乡镇编码2020年(预览图)
  17. 关于如何找到人生目标
  18. 【新知实验室 - TRTC 实践】音视频互动 Demo、即时通信 IM 服务搭建
  19. 裴蜀定理(贝祖定理)
  20. 前端面试超全整理3(webpack性能优化及监控)

热门文章

  1. 看微软唐骏招人:性格决定一切
  2. 风扇选择 风扇简单公式
  3. java大数转换成字符串,js字符串转换成数字与数字转换成字符串的实现方法
  4. 太乐了(泰勒展示求sin值)
  5. go path/filepath包文件路径操作详解
  6. Vue定时器及原理与TS封装
  7. 一位国企员工的离职文:单位不黄,都对不起秋天!
  8. 互联网不得不说的二三事
  9. JavaScript与Ajax开发作业
  10. 程序员节~想象VS现实