nginx-缓存proxy_ cache和ngx_cache_purge

2023-10-23 07:50
文章标签 nginx 缓存 cache proxy ngx purge

本文主要是介绍nginx-缓存proxy_ cache和ngx_cache_purge,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

      关于缓存的定义,可以去看我另一篇文章的介绍:浏览器/web-缓存知识点梳理

1·expires和Cache-Control

1.1·expires

使用本指令可以控制HTTP应答中的“Expires”和“Cache-Control”的头标,(起到控制页面缓存的作用)。

语法: expires [time|epoch|max|off

默认值: expires off
作用域: http, server, location

例如

配置成负数,就会变成”Cache-Control: no-cache“

配置成整数。就会变成“Cache-Control:max-age=#”,# 为指定时间的秒数。

配置成1d的话,浏览器中就可以看到“Cache-Control:max-age=86400”,86400就是1天的秒数

  location /img {

     alias /export/img/;

     expires 1d;

  }

1.2·Cache-Control

nginx也可以通过添加返回头,来修改Cache-Control的值:

cache-control :
       max-age>0时 直接从游览器缓存中提取;
       max-age<=0 时向server发送http请求确认 ,该资源是否有修改, 有的话 返回200 , 无的话 返回304。

Cache-Control更多的参数以及介绍可以看浏览器/web-缓存知识点梳理

if ($request_filename ~ .*\.(htm|html)$)

  {

     add_header Cache-Control no-cache;

  }

http协议的cache-control的常见取值及其组合释义:
no-cache: 数据内容不能被缓存, 每次请求都重新访问服务器, 若有max-age, 则缓存期间不访问服务器.
no-store: 不仅不能缓存, 连暂存也不可以(即: 临时文件夹中不能暂存该资源).
private(默认): 只能在浏览器中缓存, 只有在第一次请求的时候才访问服务器, 若有max-age, 则缓存期间不访问服务器.
public: 可以被任何缓存区缓存, 如: 浏览器、服务器、代理服务器等.
max-age: 相对过期时间, 即以秒为单位的缓存时间.
no-cache, private: 打开新窗口时候重新访问服务器, 若设置max-age, 则缓存期间不访问服务器.
-  private, 正数的max-age: 后退时候不会访问服务器.
-  no-cache, 正数的max-age: 后退时会访问服务器.

2·Last-Modified和ETag

1) Last-Modified属性通常和Expires或Cache-Control属性配合使用, 因为即使浏览器设置缓存, 当用户点击”刷新”按钮时, 浏览器会忽略缓存继续向服务器发送请求,只要资源更新时间不变,服务器就不需要返回真正的资源,只需要返回304让浏览器在本地缓存获取资源, 这时Last-Modified将能够很好的减小回应开销.

2) ETag将返回给浏览器一个资源ID, 资源如果有了新版本则正常发送并附上新的etag, 如果服务器上该资源的id和etag相同。则不返回资源,返回304,浏览器在本地缓存获取资源, 但是在服务器集群情况下, 每个服务器将返回不同的ID, 因此不建议使用ETag,可以用etag:off;来禁止etag的使用

3·proxy_cache

3.1·proxy_temp_path 指令

      为存储承载从代理服务器接收到的数据的临时文件定义目录。指定目录下支持3级子目录结构,proxy_ cache_ path 中use_temp_path为on的时候,会将文件写到该目录下

      语法: proxy_temp_path path [level1 [level2 [level3]]];

      使用 环境: http, server, location

3.2·proxy_cache_path 指令

      该 指令用于设置缓存文件的存放路径

      语法: proxy_cache_path path [levels= number] keys_zone= zone_name: zone_size [inactive= time] [max_size= size];

      使用 环境: http

      参数解释:

path:缓存存放目录

levels:设置缓存文件目录层次;levels=1:2 表示两级目录

keys_zone:设置缓存名字和共享内存大小

inactive:在指定时间内没人访问则被删除

max_size:最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。

use_temp_path:如果为 off,则 nginx 会将缓存文件直接写入指定的 cache 文件中,而不使用 temp_path 指定的临时存储路径

3.3·proxy_cache 指令

      该 指令 用于 设置 哪个 缓存 区 将被 使用, zone_name 的 值 为 proxy_cache_path 指令 创建 的 缓存 区 名称。

      语法: proxy_cache zone_name;

      使用 环境: http, server, location

3.4·proxy_cache_methods 指令

      该 指令 用于 设置 缓存 哪些 HTTP 方法, 默认 缓存 HTTP GET/ HEAD 方法, 不 缓存 HTTP POST 方法。

      语法: proxy_cache_methods [GET HEAD POST];

      默认值: proxy_cache_methods GET HEAD;

      使用 环境: http, server, location


3.5·proxy_cache_min_uses 指令

      该 指令 用于 设置 缓存 的 最小 使用 次数, 默认值 为 1。若我设置为2则表示每个请求最少被请求两次后会加入到缓存

      语法: proxy_cache_min_uses the_ number;

      使用 环境: http, server, location

3.6·proxy_cache_valid 指令

      该 指令 用于 对不 同 返回 状态 码 的 URL 设置 不同 的 缓存 时间,

      语法: proxy_cache_valid reply_code [reply_code...] time;

      使用 环境: http, server, location

      例如:

            设置 200、 302 状态 的 URL 缓存 10 分钟, 404 状态 的 URL 缓存 1 分钟。

proxy_cache_valid 200 302 10m;

proxy_cache_valid 404 1m;

            如果不 指定 状态 码, 直接 指定 缓存 时间, 则 只有 200、 301、 302 状态 的 URL 缓存 5 分钟。

proxy_cache_valid 5m;

            对 没有 单独 设置 的 状态 码, 全部 设置 缓存 时间 为 1 分钟。

proxy_cache_valid 200 302 10m;

proxy_cache_valid 301 1h;

proxy_cache_valid any 1m;

3.7·proxy_cache_key 指令

      该 指令 用来 设置 Web 缓存 的 Key 值, Nginx 根据 Key 值 md5 哈 希 存储 缓存。 一般 根据$ host( 域名)、$ request_uri( 请求 的 路径) 等 变量 组合 成 proxy_ cache_ key。

      语法: proxy_cache_key line;

      使用 环境: http, server, location

3.8·proxy_cache_bypass 

      该参数设定,什么情况下的请求不读取cache而是直接从后端的服务器上获取资源。
这里的string通常为nginx的一些变量。

      语法:proxy_cache_bypass string;

      使用环境:http, server, location

      例:proxy_cahce_bypass $cookie_nocache $arg_nocache$arg_comment;
      意思是,如果$cookie_nocache $arg_nocache$arg_comment这些变量的值只要任何一个不为0或者不为空时,
则响应数据不从cache中获取,而是直接从后端的服务器上获取。

3.9·proxy_no_cache

      该参数和proxy_cache_bypass类似,指定在什么情况下不缓存

      语法:proxy_no_cache string;

      使用环境:http, server, location

      例:proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
      表示,如果$cookie_nocache $arg_nocache $arg_comment的值只要有一项不为0或者不为空时,不缓存数据。

4·ngx_cache_purge

ngx_cache_purge是第三方模块,需要在安装的时候编译

ngx_cache_purge模块的作用:用于清除指定url的缓存

如下:

proxy_cache_path /cache/cache levels=1:2 keys_zone=cache_one:200minactive=1d max_size=30g;

location ~ /purge(/.*) {  

         #设置只允许指定的IP或IP段才可以清除URL缓存。

         allow       127.0.0.1;  

         allow       192.168.10.0/24;  

         deny    all;  

         proxy_cache_purge    cache_one   $host$1$is_args$args;  

}  

随便访问一个页面http://127.0.0.1/9.jpg,在/data/nginx/cache下面也会生成相应的缓存文件

查看cache.log,可以看到第一次访问为MISS,第二次为HIT

***19/Mar/2014:10:48:16 +0800 ***MISS ***Cache-Control: - ***Expires: - ***"GET /9.jpg HTTP/1.1" (200) ***     #后面浏览器信息就省略了
***19/Mar/2014:10:48:37 +0800 ***HIT ***Cache-Control: - ***Expires: - ***"GET /9.jpg HTTP/1.1" (304) ***

清除缓存:访问 http://127.0.0.1/purge/9.jpg,页面看到如下信息说明缓存已被清除。

Successful purge
Key : 127.0.0.1/9.jpg

Path: /data/nginx/cache/6/c1/368f9db143996c9f865921f8b2c94c16

5·使用案例

http {

log_format cache '***$time_local '  '***$upstream_cache_status '  '***Cache-Control: $upstream_http_cache_control ' '***Expires: $upstream_http_expires ' '***"$request" ($status) ' '***"$http_user_agent" '; #为需要缓存的静态资源设置一个日子格式,可以记录缓存命中记录

    proxy_temp_path    /data/nginx//temp; #定义 proxy_cache 生成临时文件的根路径。此项在 use_temp_path=off 时不需填写
    proxy_cache_path /data/nginx/cache levels=1:2  keys_zone=cache_test:10m inactive=1d  max_size=10g;

    #这里是配置了一个缓存空间.levels 指定 该 缓存 空间 有 两层 hash 目录, 第一 层 目录 为 1 个 字母, 第二层 为 2 个 字母, 保存 的 文件名 会 类似/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c;keys_zone指定该缓存空间名为cache_test,10m 指 内存 缓存 空间 大小 为 10MB;inactive 的 1d 指 如果 缓存 数据 在 1 天 内 没有 被 访问, 将被 删除; max_ size 的 10g 是指 硬盘 缓存 空间 为 10GB。

    proxy_cache_path /data/nginx/cache levels=1:2  keys_zone=cache_test2:10m inactive=1d  max_size=10g;


    upstream test{
        server 192.168.30.133:80 ;
        server 192.168.30.134:80 ;
    }
    server {
        listen       80;
        proxy_cache  cache_test;  #在这里使用了之前配置的缓存空间cache_test
        server_name  aidan.org;

        #简单使用
        location / {
            proxy_pass  http://test;
            proxy_set_header  Host  $host;
            proxy_set_header  X-Real-IP  $remote_addr;

            proxy_cache_valid 200 206 304 180d; # 根据响应码设置缓存时间,超过这个时间即使缓存文件中有缓存数据,nginx也会回源请求新数据。
        }


        #用于清除缓存,假设一个URL为http://192.168.10.3/test.txt,通过访问http://192.168.10.3/purge/test.txt就可以清除该URL的缓存。此功能需要手动编译模块ngx_cache_purge

location ~ /purge(/.*) {  

         #设置只允许指定的IP或IP段才可以清除URL缓存。

         allow       127.0.0.1;  

         allow       192.168.10.0/24;  

         deny    all;  

         proxy_cache_purge    cache_test   $host$1$is_args$args;  

}  

        #对扩展名为 gif, jpg, jpeg, png, bmp, swf, js, css 的图片,Flash, Js, CSS 文件开启 Web 缓存.其它文件不缓存:

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {

            proxy_cache  cache_test2;  #在这里使用了之前配置的缓存空间cache_test2

            proxy_cache_key $host$uri$is_args$args; # 设置 web 缓存的 key 值. Nginx 根据 key 值的 md5 哈希存储缓存.这里根据 域名,URI,参数 组成 Key

            proxy_cache_valie 200 304 12h;

            proxy_cache_valie 301 302 1m;

            proxy_cache_valie any 1m;

            expires 7d; #缓存时间

     access_log /usr/local/nginx/logs/cache.log cache; #日志

        }


       #不缓存

#表明用户访问login和search两个url的时候,变量$nocache 设置为1

if ($request_uri ~ ^/(login|search)){

 set $nocache 1;

}

location / {

 #....

 proxy_pass http://slbserver_cache;

 #当变量$nocache 为1,不缓存。

 proxy_no_cache $nocache $arg_nocache $arg_comment;

 proxy_cache_key $uri$is_args$args;

}


    }
}

推荐公众号,分享运维知识:龙叔18岁

这篇关于nginx-缓存proxy_ cache和ngx_cache_purge的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/266535

相关文章

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

Windows下Nginx的安装及开机启动

1、将nginx-1.16.1.zip解压拷贝至D:\web\nginx目录下。 2、启动Nginx,两种方法: (1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过。 (2)打开cmd命令窗口,切换到nginx目录下,输入命令 nginx.exe 或者 start nginx ,回车即可。 3、检查nginx是否启动成功。 直接在浏览器地址栏输入网址 http://lo

nginx介绍及常用功能

什么是nginx nginx跟Apache一样,是一个web服务器(网站服务器),通过HTTP协议提供各种网络服务。 Apache:重量级的,不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。这些都决定了Apache不可能成为高性能WEB服务器  nginx:

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

nginx长连接的问题

转自: http://www.360doc.com/content/12/1108/17/1073512_246644318.shtml

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

CRtmpServer转推流到Nginx Rtmp及SRS(SimpleRtmpServer)的经历

转自:http://blog.csdn.net/fengyily/article/details/42557841 本人一直用的是CRtmpServer服务,在CRtmpServer服务中根据自已的想法也加入了许多功能,如通过http接口来加载配置等,苦于不支持HLS,自已添加ts分片水平又有限,思来想去决定借助SimpleRtmpServer的HLS功能。说干就干,马上查找相关资源

由Lua 粘合的Nginx生态环境

转自:http://blog-zq-org.qiniucdn.com/pyblosxom/oss/openresty-intro-2012-03-06-01-13.html -- agentzh tech-club.org 演讲听录 免责聲明 Lua 粘合的 Nginx 生态环境 2.1. openresty 2.2. 配置小语言 2.3. ngx_drizzle 2.4.

proxy代理解决vue中跨域问题

vue.config.js module.exports = {...// webpack-dev-server 相关配置devServer: {host: '0.0.0.0',port: port,open: true,proxy: {'/api': {target: `https://vfadmin.insistence.tech/prod-api`,changeOrigin: true,p