Nginx之页面缓存
时间过得飞快,不知不觉已经大年初二,今天总结一下nginx页面缓存
nginx在web应使用上的占使用率越来越高,其带的板块也越来越来。nginx_cache算是一个,虽和专业的cache工具相比略逊一筹,但毕竟部署简单,不使用另装软件和资源开销,所以在web cache中也占了比重不小的一席
1.指令proxy_cache_path
默认值:None
用字段:http
指令指定缓存的路径和少量其余参数,缓存的数据存储在文件中,并且用代理商url的哈希值作为关键字与文件名。levels参数指定缓存的子目录数
例如:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
文件名相似于:
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
levels指定目录结构,可以用任意的1位或者2位数字作为目录结构,如 X, X:X,或者X:X:X 例如: “2”, “2:2”, “1:1:2“,但是最多只能是三级目录。
所有活动的key和元数据存储在共享的内存池中,这个区域使用keys_zone参数指定。one指的是共享池的名称,10m指的是共享池的大小。
注意每一个定义的内存池必需是不重复的路径,例如:
proxy_cache_path /data/nginx/cache/one levels=1 keys_zone=one:10m;proxy_cache_path /data/nginx/cache/two levels=2:2 keys_zone=two:100m;proxy_cache_path /data/nginx/cache/three levels=1:1:2 keys_zone=three:1000m;
假如在inactive参数指定的时间内缓存的数据没有被请求则被删除,默认inactive为10分钟。一个名为cache manager的进程控制磁盘的缓存大小,它被使用来删除不活动的缓存和控制缓存大小,这些都在max_size参数中定义,当目前缓存的值超出max_size指定的值之后,超过其大小后最少用数据(LRU替换算法)将被删除。内存池的大小按照缓存页面数的比例进行设置,一个页面(文件)的元数据大小按照操作系统来定,如FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节。
2.proxy_cache
语法:proxy_cache zone_name;
默认值:None
用字段:http, server, location
设置一个缓存区域的名称,一个相同的区域可以在不同的地方用。
在0.7.48后,缓存遵循后台的”Expires”, “Cache-Control: no-cache”, “Cache-Control: max-age=XXX”头部字段,0.7.66版本以后,”Cache-Control:“private”和”no-store”头同样被遵循。nginx在缓存过程中不会解决”Vary”头,为了确保少量私有数据不被所有的使用户看到,后台必需设置 “no-cache”或者者”max-age=0”头,或者者proxy_cache_key包含使用户指定的数据如$cookie_xxx,用cookie的值作为proxy_cache_key的一部分可以防止缓存私有数据,所以可以在不同的location中分别指定proxy_cache_key的值以便分开私有数据和公有数据。
缓存指令依赖代理商缓冲区(buffers),假如proxy_buffers设置为off,缓存不会生效。
3.proxy_cache_valid
1>语法:proxy_cache_valid reply_code [reply_code …] time;
默认值:None
用字段:http, server, location
为不同的应答设置不同的缓存时间,例如:
proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;
为应答代码为200和302的设置缓存时间为10分钟,404代码缓存1分钟。
假如只定义时间:
proxy_cache_valid 5m;
那么只对代码为200, 301和302的应答进行缓存。
同样可以用any参数任何应答。
proxy_cache_valid 200 302 10m;proxy_cache_valid 301 1h;proxy_cache_valid any 1m;
2>.定义一个简单nginx缓存服务器:
创立/Users/tenlu/learn/nginxcache_dir和/Users/tenlu/learn/nginxcache_temp
编辑文件: /usr/local/etc/nginx/vhost/itech8.conf

编辑文件:如图片所示 /usr/local/etc/nginx/vhost/itech8.conf
proxy_temp_path /Users/tenlu/learn/nginxcache_temp;
proxy_cache_path /Users/tenlu/learn/nginxcache_dir levels=1:2 keys_zone=nginxcache:20m max_size=1g;
upstream webservers {
server 127.0.0.1:83 weight=3;
server 127.0.0.1:88 weight=2;
}
server {
listen 82;
server_name localhost;
set $htdocs /usr/local/var/www/project/dny8_resume;
#添加两头部
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
location / {
root $htdocs;
autoindex on;
index index.php index.html;
if (!-e $request_filename){
rewrite ^/(.*) /index.php?$1 last;
}
proxy_pass http://webservers;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache nginxcache;
proxy_cache_valid 200 10m;
}
location ~ .php$ {
include fastcgi_params;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $htdocs$fastcgi_script_name;
}
}
3>浏览器访问localhost:82 触发proxy_cache

proxy_cache
其中变量说明如下:
$server_addr
服务器地址,在完成一次系统调使用后可以确定这个值,假如要绕开系统调使用,则必需在listen中指定地址并且用bind参数。
$upstream_cache_status表示资源缓存的状态
MISS 未命中,请求被传送到后台
HIT 缓存命中
EXPIRED -expired缓存已经过期请求被传送到后台
UPDATING – expired 因为proxy/fastcgi_cache_use_stale正在升级,将用旧的应答。
STALE – expired 因为proxy/fastcgi_cache_use_stale,后台将得到过期的应答。
HIT 命中
4>查看缓存目录
TenludeMacBook-Air :: ~/learn/nginxcache_dir ? ls
3 4 7 e
tenludeMacBook-Air :: ~/learn/nginxcache_dir ? pwd
/Users/tenlu/learn/nginxcache_dir
4. 图片/jss/css缓存
#图片缓存时间设置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*.(js|css)?$
{
expires 1h;
}
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Nginx之页面缓存