Nginx 服务器本地缓存配置(学习笔记十五)

1、

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

server{

location /{

proxy_cache my_cache

proxy_pass http://xxx

}

}

proxy_cache_path命令中的参数及对应配置说明如下:

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命令的服务中。

2、缓存还能提供容错机制


3、缓存微调

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_revalidate on;

        proxy_cache_min_uses 3;

        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;

        proxy_cache_lock on;

        proxy_pass http://my_upstream;

    }

}

4、跨多个硬盘缓存


5、客户端检测内容是否来自缓存


6、Cache-Control


7、缓存POST内容proxy_cache_methods


8、proxy_cache_bypass缓存打个洞,http://www.xxx.com/?nocache=true不拿缓存,拿服务器


8、不同响应代码设置不同缓存时间

proxy_cache_valid 200 302 10m;    #为响应码是200和302的资源,设置缓存时长为10分钟  

proxy_cache_valid 404      1m;    #为响应码是404的资源,设置的缓存的时长为1分钟  





1.Nginx的缓存简介

nginx的http_proxy模块,可以实现类似于Squid的缓存功能。Nginx对客户已经访问过的内容在Nginx服务器本地建立副本,这样在一段时间内再次访问该数据,就不需要通过Nginx服务器再次向后端服务器发出请求,所以能够减少Nginx服务器与后端服务器之间的网络流量,减轻网络拥塞,同时还能减小数据传输延迟,提高用户访问速度。同时,当后端服务器宕机时,Nginx服务器上的副本资源还能够回应相关的用户请求,这样能够提高后端服务器的鲁棒性。

2.nginx cache的最基本的配置

[plain] view plain copy

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

server {  

     set $upstream http://ip:port  

          location / {  

                   proxy_cache my_cache;  

                   proxy_pass $upstream;  

                }  

}  

配置项说明如下:

[plain] view plain copy

/path/to/cache  #本地路径,用来设置Nginx缓存资源的存放地址  

levels          #默认所有缓存文件都放在同一个/path/to/cache下,但是会影响缓存的性能,因此通常会在/path/to/cache下面建立子目录用来分别存放不同的文件。假设levels=1:2,Nginx为将要缓存的资源生成的key为f4cd0fbc769e94925ec5540b6a4136d0,那么key的最后一位0,以及倒数第2-3位6d作为两级的子目录,也就是该资源最终会被缓存到/path/to/cache/0/6d目录中  

key_zone        #在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key  

max_size        #最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件  

inactive        #未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件  

use_temp_path   #如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝  

proxy_cache     #启用proxy cache,并指定key_zone。另外,如果proxy_cache off表示关闭掉缓存。  

3.nginx缓存的一些其他知识

(1)proxy_cache_use_stale增强站点容错能力

源站有问题时,nginx可以通过proxy_cache_use_stale指令开启容错能力,即使用缓存内容来响应客户端的请求。举个栗子:

[plain] view plain copy

location / {  

    ...  

    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;  

}  

如上配置表示,当作为cache的NGINX收到源站返回error、timeout或者其他指定的5XX错误,并且在其缓存中有请求文件的陈旧版本,则会将这些陈旧版本的文件而不是错误信息发送给客户端。

(2)多磁盘分割缓存

使用NGINX,不需要建立一个RAID(磁盘阵列)。如果有多个硬盘,NGINX可以用来在多个硬盘之间分割缓存。举个栗子:

[plain] view plain copy

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

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

split_clients $request_uri $my_cache {  

    50%   "my_cache_hdd1";  

    50%   "my_cache_hdd2";  

}  

server {  

    ...  

    location / {  

        proxy_cache $my_cache;  

        proxy_pass http://my_upstream;  

    }  

}  

例子中的两个proxy_cache_path定义了两个缓存(my_cache_hdd1和my_cache_hd22)分属两个不同的硬盘。split_clients配置部分指定了请求结果的一半在my_cache_hdd1中缓存,另一半在my_cache_hdd2中缓存。基于$request_uri(请求URI)变量的哈希值决定了每一个请求使用哪一个缓存,对于指定URI的请求结果通常会被缓存在同一个缓存中。

(3)缓存命中情况的Nginx变量$upstream_cache_status

$upstream_cache_status的可能值有:

[plain] view plain copy

MISS    —— 响应在缓存中找不到,所以需要在服务器中取得。这个响应之后可能会被缓存起来  

BYPASS  —— 响应来自原始服务器而不是缓存,因为请求匹配了一个proxy_cache_bypass,这个响应之后可能会被缓存起来  

EXPIRED —— 缓存中的某一项过期了,来自原始服务器的响应包含最新的内容  

STALE   —— 内容陈旧是因为原始服务器不能正确响应。需要配置proxy_cache_use_stale  

UPDATING —— 内容过期了,因为相对于之前的请求,响应的入口(entry)已经更新,并且proxy_cache_use_stale的updating已被设置  

REVALIDATED —— proxy_cache_revalidate命令被启用,NGINX检测得知当前的缓存内容依然有效(If-Modified-Since或者If-None-Match)  

HIT —— 响应包含来自缓存的最新有效的内容  

(4)http响应头Cache-Control

当在响应头部中Cache-Control被配置为Private,No-Cache,No-Store或者Set-Cookie,不允许代理对资源进行缓存。

(5)nginx对缓存的资源会设置一个key,NGINX生成的键的默认格式是类似于下面的NGINX变量的MD5哈希值:$scheme$proxy_host$request_uri,实际的算法有些复杂。 为了改变变量(或其他项)作为基础键,可以使用proxy_cache_key命令。例如,

[plain] view plain copy

proxy_cache_key $proxy_host$request_uri$cookie_jessionid;  

(6)缓存指令proxy_cache_valid

为不同的HTTP返回状态码的资源设置不同的缓存时长。

命令格式为:

[plain] view plain copy

proxy_cache_valid [code ...] time;   

举例来说,

[plain] view plain copy

proxy_cache_valid 200 302 10m;    #为响应码是200和302的资源,设置缓存时长为10分钟  

proxy_cache_valid 404      1m;    #为响应码是404的资源,设置的缓存的时长为1分钟  

(7)缓存清理指令proxy_cache_purge

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容