qmya00 发表于 2016-12-27 10:18:32

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

  这里我要提到的是另一种实现方式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的请求缓存起来的,减少动态请求。
页: [1]
查看完整版本: 关于nginx的proxy_cache和ssi的结合使用