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、缓存还能提供容错机制


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

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;

    }

}

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

4、跨多个硬盘缓存


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

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


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

6、Cache-Control


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

7、缓存POST内容proxy_cache_methods


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

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


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

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