注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

nginx缓存方案proxy_store的使用优势分析  

2013-06-05 07:04:11|  分类: nginx编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

说明:proxy_cache提供的是新的存储与检索,而proxy_store则是以“文件系统结构”的目录结构镜像存储的办法缓存的。相对于squid与ATS都不能自动动态地更新缓存内容。好象TENGINE正在提升这个功能。

         1、nginx传统缓存之一(404)

这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。

配置:

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

location /fetch/ {                            #404定向到这里
                         internal;                                         #指明这个目录不能在外部直接访问到
                          expires 1d;                                    #网页的过期时间
                          alias       /home/html/;                    #虚拟目录文件系统地址要和locaion /一致,proxy_store会将文件保存到这目录下
                          proxy_pass  XXX ;                                  #后端upstream地址,/fetch同时是一个代理
                          proxy_set_header Accept-Encoding '';   #让后端不要返回压缩(gzip或deflate)的内容,保存压缩后的内容会引发乱子。
                          proxy_store on;                                      #指定nginx将代理返回的文件保存
                          proxy_temp_path /home/tmp;                 #临时目录,这个目录要和/home/html在同一个硬盘分区内
}

注:使用的时候还有要注意是nginx要有权限往/home/tmp和/home/html下有写入文件的权限,在linux下nginx一般会配置成 nobody用户运行,这样这两个目录就要chown nobody,设成nobody用户专用,当然也可以chmod 777,不过所有有经验的系统管理员都会建议不要随便使用777。另外,还要区别对待root与alias定义的存储点的不同具体意义。

         2、传统缓存之二(if(!-eXXX))

    原理和404跳转基本一致,但更简洁一些:

location / {
                    root /home/html/;
                    proxy_store on;
                    proxy_set_header Accept-Encoding '';
                    proxy_temp_path /home/tmp;
                    if ( !-f $request_filename )
                       {
                           proxy_pass  XXX;
                        }
}

可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。


             两种传统缓存都有着基本一样的优点和缺点:

        缺 点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保 存文件名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持这种形式的首页 和二级目录,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能 正确保存。
        缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。
        缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。
        缺点4:nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。

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

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

        这两种传统缓存都可以在linux下将文件保存到/dev/shm里,一般我也是这么做的,这样可以利用系统内存来做缓存,利用内存的话,清理过期 内容速度就会快得多。使用/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保守了点,但也基本够用了。

         更多说明......

  评论这张
 
阅读(197)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017