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

itoedr的it学苑

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

 
 
 

日志

 
 

Nginx 的 proxy_store 缓存(应用分析:转存)  

2013-06-15 16:51:15|  分类: nginx编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

有个运行Asp的应用,比较土,还是用本地 *.mdb 的数据库。这么一来,就不可能通过 Apache ::: asp 这样的插件令其运行在Linux的环境中。而且是相当烂的一个 asp 程序,连html模板都没单独目录存放,直接跟 *.asp 混在一块。 Nginx, 是对待这种破东西最好的优化。

如果直接靠 IIS 既处理 asp 又处理静态文件的话,流量一大性能是不堪想象了。
(在ab压力测试中, 就100线程请求一个 gif 的静态文件做测试, 已经令IIS的CPU相当不安)

2台服务器,运行架构计划为最简单的 Nginx --> IIS

就通过 Nginx Proxy 到IIS 的80端口上,实际上是使用了nginx的负载均衡的功能。

但测试的时候发现,虽然速度瞬间得到体现,但每次请求,Nginx 都会往IIS上拉文件,特别是静态文件。
大,而且会让IIS的cpu不安分。

原本试用在 Linux 下 mount  一个 smb 的盘,然后让Nginx直接往里头通过 smb 请求 IIS 应用服务器上的静态文件。从而绕开 IIS 避免压力。但出了怪问题......

最后用上了 Nginx proxy_store ,Nginx 直接把静态文件在本地硬盘创建并读取,效果相当好,而且某程度上对待这么烂的应用要装个Squid 确实有点大题小作。(proxy_store反而成为了CDN世界中的一个特色NGINX功能)

但 Proxy_store 跟 Squid 是有区别的!! 最明显的一点在于其不具有expires,无法通过程序控制cache什么时间过期(proxy_store的缺点在这了)。当然可以写个脚本定期删除缓存目录中的内容。

以下是参考配置方式:

如果需要将文件缓存到本地,则需要增加如下几个子参数:
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path 缓存目录;#实际上nginx的缓存代理中起到的是核心枢纽功能,初学者需要理解的地方。

其中,
proxy_store on 启用缓存到本地的功能;
proxy_temp_path 指定缓存在哪个目录下,如:proxy_temp_path /var/nginx_cache;#为了提高文化转移效率,这个/var/nginx_cache最好和root alias关联的存储区在同一个硬盘上,而且最好是同一个分区上,这样可以轻松实现文件从临时目录到cdn文件的软拷贝,而不是再来一次内容迁移,要不新的I/O负载就来了。

重点内容:

   在经过上一步配置之后,虽然文件被缓存到了本地磁盘上,但每次请求仍会向远端拉取文件,为了避免去远端拉取文件,还必须增加:

            if ( !-e $request_filename) {
            proxy_pass  http://192.168.10.10;
            }

          这儿可以这样理解: !-e $request_filename激活了nginx对缓存内容的采用功能,要不就由proxy_pass再代理一次了。其中具体执行过程可以分析一下nginx的原代码。

  即改成有条件地去执行proxy_pass,这个条件就是当请求的文件在本地的proxy_temp_path指定的目录下不存在时,再向后端拉取。

整体配置例子:

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|html|htm|css)$ {        #指定缓存文件类型
            expires 7d;      #设置浏览器过期时间
            root /data1/nginx_cache/iis;          #静态文件根目录目录(必须对应proxy_temp_path)
            proxy_store on;        #开启缓存机制
            proxy_store_access user:rw group:rw all:rw;       #缓存读写规则
            proxy_temp_path /data1/nginx_cache/iis;            #存放静态文件的缓存目录
            include proxy.conf;          # 外联proxy理的详细配置如proxy_set_header, client_max_body_size ....
            if ( !-e $request_filename) {     #正则表达式,匹配缓存目录中的文件与源文件是否存在)
            proxy_pass  http://192.168.10.10   # IIS 应用的服务器地址
            }
        }

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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