首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

关于nginx的proxy_cache跟ssi的结合使用

2012-11-23 
关于nginx的proxy_cache和ssi的结合使用分 隔 线

关于nginx的proxy_cache和ssi的结合使用


关于nginx的proxy_cache跟ssi的结合使用

==========================分 隔 线============================

我们在开发中经常会遇见一个问题,就是整个页面是静态页面,但这页面局部区域是动态内容。

假设上图整个页面是静态页面,推荐课程那块区域是动态模块。(这里只是假设,实际上恰恰相反,

我这页面整个是动态请求,里面的许多模块是使用的是缓存模块,这得归功于淘宝强大的PageCache技术支持^_^)

?

言归正传,要实现这种静态页面部分动态内容引入的功能,常见的是使用JS来加载数据进行显示。

?

这里我要提到的是另一种实现方式proxy_cache结合ssi来实现。

?

先大致介绍下nginx的proxy_cache:http://blog.s135.com/nginx_cache/

?

有兴趣的同学可以顺带了解下nginx的proxy_store模块。不过个人一直比较看好proxy_cache,

原因嘛:不需要借助crontab等来定时刷新;也不需要关心分布式同步问题。

?

再介绍下nginx的ssi?.

开启方式:

?

location / {

? ? ? ? ? ? ssi on;

}

使用示例:

<!--#include virtual="/ssicache/common/1234/works-rank.html"-->

?

proxy_cache结合ssi来实现具体使用示例:

?

?

1.在你的静态页中ssi一个动态内容:

<!--#include virtual="/ssicache/common/1234/works-rank.html"-->

?

这个works-rank.html大家困惑了吧,怎么看都是静态页面块呀,别急。

?

2.写一个代理server:

?

?

server{

? ? ? ? listen ? ? ? 80;

? ? ? ? server_name ssi.bisai.com;

? ? ? ? ?....省略...

? ? ? ? rewrite ^/ssicache/common/(.*)/(.*)\.html$ /partial/contest/$1/$2.do last;

? ? ? ? location / {

? ? ? ? ? ? proxy_pass ? http://contest_servers;

? ? ? ? ? ? include proxy.conf;

? ? ? ? }

}

?

这样一来,works-rank.html的请求就被rewrite?到/partial/contest/1234/works-rank.do上面去了^_^

?

3.将动态请求works-rank.do返回的数据用proxy_cache缓存起来,减少对服务器的动态请求。

PS:配置proxy_cache的时候,实际上是缓存^/ssicache的请求。

因为实际最先请求的是/ssicache/common/1234/works-rank.html,发现works-rank.html缓存过期了,才会

重新去ssi.bisai.com请求,最后请求被rewrite到works-rank.do上面去,将得到的内容继续缓存。

?

?

server{

? ? ? ? listen ? ? ? 80;

? ? ? ? server_name bisai.com;

? ? ? ? ...省略...

? ? ? ??location / {

? ? ? ? ? ? ssi on;

? ? ? ? ? ? proxy_pass ? http://contest_servers;

? ? ? ? ? ? include proxy.conf;

? ? ? ? }

?

? ? ? ??location ~ ^/ssicache/ {

? ? ? ? proxy_cache cache_one;

proxy_cache_valid ?200 304 10m;

proxy_cache_key $host$uri;

proxy_set_header Host "ssi.bisai.com";

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header http_x_forwarded_for $http_x_forwarded_for;

proxy_set_header SCRIPT_URL $request_uri;

proxy_pass http://ssi.bisai.com;

? ? ? ? }

? ? ? ? ....省略....

}

?

好啦,到这为止,功能基本实现了,细节上处理大家可以查阅上面的资料,比如:

?

1.proxy_temp_path和?proxy_cache_path的设置。

2.如果使用的是velocity模板,使用ssi 语法时对"#"的处理。

?

这些都很简单了。

这样做完之后,你的这个动态模块实际上是可以共用的,任何需要这样一个模块的地方,都可以直接SSI 进来。

实际上,就是如果你用JS来加载数据实现的话,也同样是可以使用proxy_cache将JS的请求缓存起来的,减少动态请求。

?

?

热点排行