Nginx 针对上游服务器缓存

2019-03-05 来源: jackey_ji 发布在  https://www.cnblogs.com/jackey2015/p/10478450.html

L:99

nginx缓存 : 定义存放缓存的载体

proxy_cache 指令

Syntax: proxy_cache zone | off;
Default:
proxy_cache off;
Context: httpserverlocation

proxy_cache_path 指令 定义磁盘哪个位置存放缓存文件

Syntax: proxy_cache_path path [levels=levels] [use_temp_path=on|offkeys_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

proxy_cache_path 指令参数详解

path : 定义缓存文件的存放位置

levels :定义缓存路径的目录层级,最多3级,每层目录长度为1或2字节

use_temp_path:如果设置on时,文件会放到proxy_temp_path定义的临时目录

         如果设置off时 ,文件就会存放到默认的proxy_cache_path目录

keys_zone:name是共享内存的名字,由proxy_cache指令使用

      size 是指共享内存大小,1mb大约可以存放8000个key

inactive :在inactive时间内没有被访问的缓存会被淘汰掉 默认10分钟

max_size:设置最大的缓存文件大小,超出后由cache manager进程按LRU链表淘汰

manager_file :cache manager 进程在1次淘汰过程中,淘汰的最大文件数 默认100

manager_sleep :执行一次淘汰循环后 cache manager进程的休眠时间  默认200毫秒

manager_threshold :执行一次淘汰循环的最大耗时 默认50毫秒

loader_files : cache_loader 进程载入磁盘中缓存至共享内存,每批最多处理的文件数 默认100

loader_sleep : 执行一次缓存文件至共享内存后,进程休眠时间 默认200毫秒

loader_threshold : 每次载入缓存文件至共享内存的最大耗时 默认50毫秒 

 

缓存关键字

Syntax: proxy_cache_key string;
Default:
proxy_cache_key $scheme$proxy_host$request_uri;
Context: httpserverlocation

缓存的响应

Syntax: proxy_cache_valid [code ...] time;(时间是必填的code是选填)
Default:
Context: httpserverlocation

对不同的响应码缓存不等的时长

  如 : code 404 5m;

 标识时间

  仅对以下响应缓存

   200、301、302

通过响应头部控制缓存时长

  X-Accel-Expires 单位秒

  值为 0 时 禁止nginx缓存内容

  可以通过 @设置缓存到某一个个时刻

  响应头若含有 Set-Cookie则不缓存

  响应头含有Vary:*则不缓存

设置那些内容不使用缓存

Syntax: proxy_no_cache string ...参数为真时 响应不存入缓存;
Default:
Context: httpserverlocation

如:proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;

  proxy_no_cache $http_pragma $http_authorization;

当相应值为真 就不使用缓存内容

Syntax: proxy_cache_bypass string ...;
Default:
Context: httpserverlocation


更变HEAD方法
Syntax: proxy_cache_convert_head on | off;
Default:
proxy_cache_convert_head on;
Context: httpserverlocation


Upstream_cache_status变量与值说明

Miss : 为命中缓存

HIT : 命中缓存

EXPIRED : 缓存已经过期

STALE : 命中了陈旧的缓存

UPDATING : 内容陈旧,但正在更新

REVALIDATED : nginx验证了陈旧的内容依然有效

BYPASS : 响应是从原始服务器获得的

HTTP/1.1 200 OK
Server: openresty/1.13.6.2
Date: Fri, 08 Mar 2019 10:23:45 GMT
Content-Type: text/plain
Content-Length: 6
Connection: keep-alive
Last-Modified: Wed, 13 Feb 2019 09:03:32 GMT
ETag: "5c63dd64-6"
X-Cache-Status: HIT
Accept-Ranges: bytes

代码演示下游服务器代码示列:

proxy_cache_path /data/tmpcache levels=: keys_zone=two:10m loader_threshold=
                     loader_files= max_size=200m inactive=1m;

server {
    server_name shop**.com.cn;
    root html/;  error_log logs/cacherr.log debug; #打开DEBUG日志能实时看查看问题
    location /{
        proxy_cache two; #用了 上面的keys_zone定义的two 并且缓存10分钟
        proxy_cache_valid  1m; #如果是响应码200 则是1分钟有效期
        add_header X-Cache-Status $upstream_cache_status; #这里添加了个头 值就是前面介绍缓存状态值
        proxy_pass http://192.168.0.51:8012;;
    }
}

针对这个上游服务器代码不阐述了就简单 配置个1.txt能访问的静态文件即可

我们演示个请求

curl http://shop***.com.cn:8080/1.txt -I

我们看下返回的头

HTTP/1.1 200 OK
Server: openresty/1.13.6.2
Date: Sat, 09 Mar 2019 06:38:56 GMT
Content-Type: text/plain
Content-Length: 6
Connection: keep-alive
Last-Modified: Wed, 13 Feb 2019 09:03:32 GMT
ETag: "5c63dd64-6"
X-Cache-Status: MISS  #这个就是我们在location 放的头部 值为缓存状态
Accept-Ranges: bytes

再次请求 curl http://shop***.com.cn:8080/1.txt -I

HTTP/1.1 200 OK
Server: openresty/1.13.6.2
Date: Sat, 09 Mar 2019 06:39:00 GMT
Content-Type: text/plain
Content-Length: 6
Connection: keep-alive
Last-Modified: Wed, 13 Feb 2019 09:03:32 GMT
ETag: "5c63dd64-6"
X-Cache-Status: HIT #我们发现 值边了 处于hit 命中状态 说明已经用的是缓存了
Accept-Ranges: bytes

 所有缓存文件否存放在 /data/tmpcache 这个目录下

我们针对上游服务器也可以如下配置

server {
                listen ;
                default_type text/plain;
                root html;
                add_header X-Accel-Expires ;#配置3秒钟缓存过期          add_header Vary *; #表示不做缓存 怎么访问都是MISS          add_header Cache_Control 'max-age=3,state-while-revalidate=3'; #类似Vary * 也表示不做缓存
                location / {

                }
}

 

相关文章