location ~ ^/(xx|yy)\.action{
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header X-Cache $upstream_cache_status; //看解释1
proxy_cache dream_cache;
proxy_cache_key $host$uri$is_args$arg_pageNo$arg_subjectId;//看解释2
proxy_cache_methods GET POST;
proxy_cache_valid 200 301 302 5s;
proxy_cache_use_stale error timeout updating http_404 http_500 http_502 http_503;//看解释3
proxy_cache_lock on;//看解释4
proxy_cache_lock_timeout 5s;
proxy_pass http://localhost;
}
解释1:
add_header X-Cache $upstream_cache_status;是让我们可以方便地通过reponse的头部观察缓存命中状态。
nginx提供了$upstream_cache_status这个变量来显示缓存的状态,我们可以在配置中添加一个http头来显示这一状态,达到类似squid的效果。
$upstream_cache_status包含以下几种状态:
·MISS 未命中,请求被传送到后端
·HIT 缓存命中
·EXPIRED 缓存已经过期请求被传送到后端
·UPDATING 正在更新缓存,将使用旧的应答
·STALE 后端将得到过期的应答
解释2:
proxy_cache_key $host$uri$is_args$arg_pageNo$arg_subjectId;指定了缓存的key,一般是url。这里注意两个变量:
(1)$is_args'?'问号
(2)$args;表示问号后面的所有参数
这里的例子的写法我认为更需要懂得,这是指定部分参数的写法,pageNo、和subjectId两个参数,而忽略其他的参数,比如遇到有加时间戳的时候,可以忽略掉时间戳,否则缓存永远也不会命中的。
解释3:
proxy_cache_use_stale error timeout updating http_404 http_500 http_502 http_503;
proxy_cache_use_stale 指定后端服务器出现什么状况时,nginx可以使用的过期缓存。
比如制定了updating,它将保证只有一个线程去更新缓存,并且在这个线程更新缓存的过程中其他的线程只会响应当前缓存中的过期版本。
解释4:
proxy_cache_lock on;
1 proxy_cache
语法:proxy_cache zone_name;
默认值:None
使用字段:http, server, location
设置一个缓存区域的名称,一个相同的区域可以在不同的地方使用。
在0.7.48后,缓存遵循后端的”Expires”, “Cache-Control: no-cache”, “Cache-Control: max-age=XXX”以及其他等。然而,目前nginx会忽略一些缓存控制指令,如:”private”和”no-store”,同样,nginx在缓存过程中不会处理”Vary”头,为了确保一些私有数据不被所有的用户看到,后端必须设置 “no-cache”或者”max-age=0″头,或者proxy_cache_key包含用户指定的数据如$http_cookie_xxx,在proxy_cache_key中使用一部分cookie的值可以防止缓存私有数据,所以可以分别指定location以便分开私有数据和公有数据。
缓存指令依赖代理缓冲区(buffers),如果proxy_buffers设置为off,缓存不会生效。
2 proxy_cache_key
语法:proxy_cache_key line;
默认值:$scheme$proxy_host$request_uri;
使用字段:http, server, location
指令指定了包含在缓存中的缓存关键字。
proxy_cache_key
"$host$request_uri$cookie_user";
proxy_cache_key
"$scheme$host$request_uri";
| proxy_cache_key "$host$request_uri$cookie_user"; |
| proxy_cache_key "$scheme$host$request_uri"; |
3 proxy_cache_path
语法:proxy_cache_path path [levels=number] keys_z [inactive=time] [max_size=size];默认值:None使用字段:http指令指定缓存的路径和一些其他参数,缓存的数据存储在文件中。缓存的文件名和key为代理URL的MD5 码。levels参数指定缓存的子目录数,例如:proxy_cache_path
/data/nginx/cache levels=1:2 keys_z/td>
文件名类似于:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c所有活动的key和元数据存储在共享的内存区域中,这个区域用keys_zone参数指定,如果在inactive参数指定的时间内缓存的数据没有被请求则被删除,默认inactive为10分钟。cache manager进程控制磁盘的缓存大小,在max_size参数中定义,超过其大小后最少使用数据将被删除。区域的大小按照缓存页面数的比例进行设置,一个页面(文件)的元数据大小按照操作系统来定,FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节,当区域满了以后key将按照LRU(最近最少使用算法)进行处理。proxy_cache_path和proxy_temp_path应该使用在相同的文件系统上。
| proxy_cache_path /data/nginx/cache levels=1:2 keys_z/td> |
文件名类似于:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c所有活动的key和元数据存储在共享的内存区域中,这个区域用keys_zone参数指定,如果在inactive参数指定的时间内缓存的数据没有被请求则被删除,默认inactive为10分钟。cache manager进程控制磁盘的缓存大小,在max_size参数中定义,超过其大小后最少使用数据将被删除。区域的大小按照缓存页面数的比例进行设置,一个页面(文件)的元数据大小按照操作系统来定,FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节,当区域满了以后key将按照LRU(最近最少使用算法)进行处理。proxy_cache_path和proxy_temp_path应该使用在相同的文件系统上。
4 proxy_cache_methods
语法:proxy_cache_methods [GET HEAD POST];
默认值:proxy_cache_methods GET HEAD;
使用字段:http, server, location
GET/HEAD用来装饰语句,即你无法禁用GET/HEAD即使你只使用下列语句设置:
proxy_cache_methods
POST;
| proxy_cache_methods POST; |
5 proxy_cache_min_uses
语法:proxy_cache_min_uses the_number;默认值:proxy_cache_min_uses 1;使用字段:http, server, location多少次的查询后应答将被缓存,默认1。
6 proxy_cache_valid
语法:proxy_cache_valid reply_code [reply_code ...] time;
默认值:None
使用字段:http, server, location
为不同的应答设置不同的缓存时间,例如: proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid 5m; proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m;
7 proxy_cache_use_stale
为了防止缓存失效(在多个线程同时更新本地缓存时),你可以指定’updating’参数,它将保证只有一个线程去更新缓存,并且在这个线程更新缓存的过程中其他的线程只会响应当前缓存中的过期版本。
代码及configure配置:
在ngx_http_proxy_module.c里面定义了每个指令的钩子(即callback),它们在读取配置文件时会被调用。在configure的时候只需要把“HTTP_CACHE”设置为YES(可以找到auto/options里面HTTP_CACHE那行)。“proxy_cache_purge”指令需要下载nginx add-ons里面的“Cache Purge”模块,并在configure的时候用"--add-module="来加载代码。
以下附件一些其他nginx缓存内容,但是现在很少使用了,有兴趣可以了解下:
以上就介绍了Nginx缓存整理,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。