nginxcache:nginx缓存Cachecache的几种方案

  貌似从来没有写过nginx缓存Cache功能都是只看不分享这是不好的习惯啊

  1、传统缓存Cache的(404)

  这个办法是把nginx404定向到后端然后用proxy_store把后端返回页面保存

  配置:

location / {
root /home/html/;#主目录
expires 1d;#网页过期时间
error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下
}

location /fetch/ {#404定向到这里
ernal;#指明这个目录不能在外部直接访问到
expires 1d;#网页过期时间
alias /home/html/;#虚拟目录文件系统地址要和locaion /proxy_store会将文件保存到这目录下
proxy_pass http://www.sudone.com/;#后端upstream地址/fetch同时是个代理
proxy__header Accept-Encoding '';#让后端不要返回压缩(gzip或deflate)内容保存压缩后内容会引发乱子
proxy_store _disibledevent=>  缺点2:nginx内部没有缓存Cache过期和清理任何机制这些缓存Cache文件会永久性地保存在机器上如果要缓存Cache东西非常多那就会撑暴整个硬盘空间为此可以使用个shell脚本定期清理同时可以撰写php等动态来做实时更新

  缺点3:只能缓存Cache200状态码因此后端返回301/302/404等状态码都不会缓存Cache假如恰好有个访问量很大伪静态链接被删除那就会不停穿透导致后端承载不小压力

  缺点4:nginx不会自动选择内存或硬盘作为存储介质切由配置决定当然在当前操作系统里都会有操作系统级文件缓存Cache机制所以存在硬盘上也不需要过分担心大并发读取造成io性能问题

  nginx传统缓存Cache缺点也是它和squid等缓存Cache软件Software区别的特色所以也可看作其优点在生产应用中它常常用作和squid搭档squid对于带?链接往往无法阻挡而nginx能将其访问拦住例如:http://sudone.com/?和http://sudone.com/在squid上会被当做两个链接所以会造成两次穿透;而nginx只会保存无论链接变成http://sudone.com/?1还是http://sudone.com/?123均不能透过nginx缓存Cache从而有效地保护了后端主机

  nginx会非常老实地将链接形式保存到文件系统中这样对于个链接可以很方便地查阅它在缓存Cache机器上缓存Cache状态和内容也可以很方便地和别文件管理器如rsync等配合使用它完完全全就是个文件系统结构

  这两种传统缓存Cache都可以在linux下将文件保存到/dev/shm里般我也是这么做这样可以利用系统内存来做缓存Cache利用内存清理过期内容速度就会快得多使用/dev/shm/时除了要把tmp目录也指向到/dev/shm这个分区外如果有大量小文件和目录还要修改下这个内存分区inode数量和最大容量:

  mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm

  上面命令在台有3G内存机器上使用/dev/shm默认最大内存是系统内存半就是1500M这条命令将其调大成2500M同时shm系统inode数量默认情况下可能是不够用但有趣是它可以随意调节这里调节为480000保守了点但也基本够用了

  3、基于memcached缓存Cache

  nginx对memcached有所支持但是功能并不是特别的强性能上还是非常的优秀

location /mem/ {
( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
{
$memcached_key "$1";
memcached_pass 192.168.1.2:11211;
}
expires 70;
}


  这个配置会将http://sudone.com/mem/abc指明到memcachedabc这个key去取数据

  nginx目前没有写入memcached任何机制所以要往memcached里写入数据得用后台动态语言完成可以利用404定向到后端去写入数据

  4、基于第 3方插件ncache

  ncache是新浪兄弟开发个不错项目它利用nginx和memcached实现了部分类似squid缓存Cache功能我并没有使用这个插件经验可以参考:



  http://code.google.com/p/ncache/

  5、nginx新开发proxy_cache功能

  从nginx-0.7.44版开始nginx支持了类似squid较为正规cache功能目前还处于开发阶段支持相当有限这个缓存Cache是把链接用md5编码hash后保存所以它可以支持任意链接同时也支持404/301/302这样非200状态

  配置:

  首先配置个cache空间:

  proxy_cache_path /path/to/cache levels=1:2 keys_zone=NAME:10m inactive=5m max_size=2m clean_time=1m;

  注意这个配置是在server标签外levels指定该缓存Cache空间有两层hash目录层目录是1个字母第 2层为2个字母保存文件名就会类似/path/to/cache/c/29/b7f54b2df7773722d382f4809d65029c;keys_zone为这个空间起个名字10m指空间大小为10MB;inactive5m指缓存Cache默认时长5分钟;max_size2m是指单个文件超过2m就不缓存Cache;clean_time指定分钟清理次缓存Cache

location / {
proxy_pass http://www.sudone.com/;

proxy_cache NAME;#使用NAME这个keys_zone

proxy_cache_valid 200 302 1h;#200和302状态码保存1小时
proxy_cache_valid 301 1d;#301状态码保存
proxy_cache_valid any 1m;#其它保存分钟
}


  ps:支持cache0.7.44到0.7.51这几个版本稳定性均有问题访问有些链接会出现所以这几个版本最好不要在生产环境中使用nginx-0.7下目前所知较为稳定版本是0.7.39稳定版0.6.36版也是近期更新如果在配置里没有使用到0.7些新标签新功能也可以使用0.6.36版



Tags:  nginx nginx清理缓存 nginx清除缓存 nginxcache

延伸阅读

最新评论

发表评论