从整体来看,nginx的缓存cache总共有五种,接下来分别来介绍每一种缓存的机制以及各自的特色:css
1.传统缓存之一html
该方法是将nginx的404错误页面定位到后端,而后在使用poxy_store将后端返回的页面进行保存。java
location/{nginx
root/home/html;#主目录web
expires 1d;#网页的过时时间shell
error_page 404=200/fetch$request_uri;#404界面定向到fetch目录下数据库
}后端
location /fetch{#404界面定向到该路径下缓存
internal;#指明该目录下不能再外部直接访问服务器
expires:1d :#网页访问过时时间
alias/home/html;#虚拟目录文件系统要和location /同样,proxy_store会将文件保存到这个目录下面
proxy_pass:http://javaDevelopment.com;#后端upstream地址,/fetch同时是一个代理
proxy_set_header Accept-Encoding'';#为了使得后端不要返回压缩的内容
proxy_store on ;#指定nginx代理返回的文件保存
proxy_temp_path /home/tmp;#临时目录,该目录必定要和/home/html放到同一磁盘分区中
}
使用的时候还要确保nginx要有权限在/home/tmp和/home/html下面有写入文件的权限,直接使用chmod 777进行受权便可。
2.传统缓存之二
原理同上,可是使用更简洁一些,以下:
location /{
root/home/html;
proxy_store on;
proxy_set_header Accept-Encoding'';
poxy_temp /home/tmp;
if(!-f $request_filename)
{
proxy_pass http://javaDevelopMent.com;
}
}
该配置属性代码比较少,使用!-f来判断请求的文件系统上存不存在,若是不存在就使用proxy_pass到后端去,一样返回的是proxy_store保存。
该两种方式有着一样的优缺点:
缺点1:不支持带参数的动态连接,同时也不支持一级目录和二级目录同时缓存,nginx会把二级目录认为跟一级目录是同一个连接,因此会保存失败,在这种状况下都须要写rewrite才能正确保存。
缺点2:nginx内部没有缓存过时和任何清理的任何机制,这些缓存的文件将永远的保存在服务器上。若是不及时的清理,必定程度上硬盘中将没法存储多的文件,须要写shell脚本进行定时的清理。
缺点3:nginx服务器上智能缓存status为200的,后端返回的301,302,404状态的都不会缓存。
缺点4:nginx不会自动选择内存或硬盘做为存储介质,一切有配置决定。
3.基于memcached
nginx对memcached也会支持
location /mem/{
if ($uri~"^/mem/([0-9A-Za-z_]*$)"){
set $memcached_key "$1";
memcached_pass 192.168.9.12:11211
}
expires 120;
}
该配置会将http://javaDevelopMent.com/mem/java指明到memcached的java这个key去取数据
nginx目前没有写入memcached的任何机制,所以要往memcached中写入数据须要用动态语言来完成,可使用404定向到后端写入数据中。
4.基于第三方插件ncache
ncache是基于web服务器模型构建起来的缓存系统,属于sina公司的开源产品。
起初的目的是为了提高缓存响应速度而开发的,而squid(磁盘缓存)的速度比较慢,ncache的优点就在于此。
ncache最先的时候是做为nginx的一个HTTP模块进行开发的,由于考虑到其以后的兼容性和可扩展性,做为更好的独立模块,能够普遍的推广和使用。但后来随着功能的扩充,代码的增多,nginx原有的框架异能不能知足开发中的需求,所以采用提取nginx内部核心代码,并把cache部分嵌入其中,就造成了今天的ncache。
ncache彻底是一套定制化的产品,能够知足快速部署、简单易用,高并发、大存储量的需求,它不须要复杂的配置。
直接安装便可。
运行ncache的命令
/usr/local/webserver/nacahe/sbin/nginx
中止nacahe命令
killall -9 nginx
查看ncache状态
curl "http://127.0.0.1/ncache_state"
ncache后端内容服务器设置
(1)必须使用Http Head头“Cache-Controll:max-age=秒数”来控制缓存时间,若是不指定将不缓存。
(2)后端内容源服务器发送ncache的Http数据,必须带有“Content-Length”Header头部。
(3)ncache的缓存时间以分钟为单位,会将全部max-age=秒数转换成分钟数,若是max-age小于1分钟,ncache将默认将缓存时间设置成1分钟。
(4)自动删除缓存文件进程,会在天天的凌晨两点删除大约20%的不活动缓存数据。
ncache能够对数据进行快速和线性可扩展的分布式缓存,减小对数据库的访问。ncache能够帮助消除数据库的性能瓶颈,扩展java应用程序的事务处理极限。
ncache2.0版本,是做为一个完整的nginx模块进行发布和使用的,在原有的内核上进行了剥离,更方便开发者的安装和配置。
5.proxy_cache功能(新功能)
从nginx-0.7.44版本开始,nginx支持相似squid较为正规的cache功能,目前还处于开发阶段,这个缓存是把连接用MD5编码hash后保存,所以支持任意连接,也支持404/301/302非正常状态。
首先配置一个cache空间
proxy_cache_path /javaDevelopMent.com/to cache
levels=1:2 keys_zone=java1:10M inactive=5m max_size=2M celan_time=1m;
proxy_temp_path参数路劲也要跟proxy_cache_path在一个分区上
以上配置参数说明;
levels:指定该缓存空间有两层hash目录,第一层为1个字母,第二层为2个字母;
keys_zone:为空间起名字 10M指空间大小
inactive=5m指默认缓存时间5分钟
max_size=2M文件最大超过2M就不缓存
celan_time=1m指定一分钟清理一次
综合起来以下:
location ~.*\.(js|css|gif|jpg|jpeg|png|bmp|swf|flv)$
{
proxy_pass :http://backend;
expires 6h;
proxy_cache java1;//使用java1这个keys_zone
proxy_cache_vaild 200 302 1h;
proxy_cache_vaild 301 1d;
proxy_cache_vaild any 1m;
}
注:支持缓存的cache0.7.44和0.7.51之间的这个版本稳定性均有问题,这几个版本不建议在生产环境中使用,0.7.39位目前最稳定的版本,建议使用。