收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 4222|回复: 0

[网络] Nginx的代理缓存+PHP清除缓存

[复制链接]
发表于 2009-3-25 23:14:33 | 显示全部楼层 |阅读模式
Nginx有很强的代理功能,作为proxy很有优势,另外还可以把文件缓存到本地,实在是很不错的。
但可惜的是,默认没有文件过期控制,文件作为长期镜像是很不错的。

Nginx代理不需要下载到服务器端再发送,有进程下载完整内容了估计就可以保存到本地了,需要清理的话,下面有介绍简单的方法。Nginx的文件发送性能就不用担心了,很稳定高效。

详情参考:NginxHttpProxyModule

proxy_store
syntax: proxy_store [on | off | path]

default: proxy_store off

context: http, server, location

This directive sets the path in which upstream files are stored. The parameter "on" preserves files in accordance with path specified in directives alias or root. The parameter "off" forbids storing. Furthermore, the name of the path can be clearly assigned with the aid of the line with the variables:

proxy_store   /data/www$original_uri;

The time of modification for the file will be set to the date of "Last-Modified" header in the response. To be able to safe files in this directory it is necessary that the path is under the directory with temporary files, given by directive proxy_temp_path for the data location.


也就是说的是可以缓存文件了,怎么做呢?
可以参考下面的代码片段:

  1. upstream aslibra {
  2.   server 123.45.67.89 ;
  3.   server 123.45.67.8 backup;
  4. }

  5. proxy_store             on;
  6. proxy_store_access      user:rw  group:rw  all:r;
  7. proxy_temp_path /Data/webapps/proxy_tmp;
  8. proxy_redirect off;

  9. proxy_set_header Host $host;
  10. proxy_set_header X-Real-IP $remote_addr;
  11. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  12. server {
  13.   expires       240h;
  14.   server_name  www.aslibra.com;
  15.   root    /Data/webapps/www.aslibra.com;
  16.   location / {
  17.     add_header      X-Cache   HIT;
  18.     error_page           404 = @fetch;
  19.   }

  20.   location @fetch {
  21.     internal;
  22.     proxy_pass                      http://aslibra;
  23.     proxy_next_upstream http_500;
  24.     add_header      X-Cache   MISS;
  25.     root                    /Data/webapps/www.aslibra.com;
  26.   }
  27. }
复制代码


另外,文件要更新怎么办?那其实有两种方式解决文件过期的情况:
1 定时删除修改时间太旧的文件
2 PURGE方式直接删除

定时删除文件
下面是每2小时删除修改时间超过2天的文件

  1. #clear cache pic
  2. 01 */2 * * * root find /Data/webapps/www.aslibra.com/ -type f -mtime +2 -print0 | xargs -0 -r rm >/dev/null 2>&1
复制代码


PURGE方式删除

如果不是要求实时删除的话,可以有一种思路:
PURGE请求的(或者其它标识)记录日志,然后每10分钟分析日志,删除日志里面的文件,这样效率应该也是不错的~我没有做这个,我还是希望兼容PURGE,那怎么办呢?

那就交给fastcgi处理好了(注意,Nginx不支持cgi),比如:

  1. location / {
  2.   if ($request_method ~ "PURGE"){
  3.     rewrite (.*) /purge.php last;
  4.   }
  5.   add_header      X-Cache   HIT;
  6.   error_page           404 = @fetch;
  7. }
  8. location /purge.php
  9. {
  10.   internal;
  11.   fastcgi_pass   127.0.0.1:9000;
  12.   include        fastcgi_params;
  13.   fastcgi_param  SCRIPT_FILENAME    /Data/www.aslibra.com/fastcgi$fastcgi_script_name;
  14. }
复制代码


这个就是把请求交给PHP了啦,PHP怎么写呢?
下面有个简单的例子:

  1. <?
  2. header('Cache-Control: max-age=0');
  3. $uri = $_SERVER['REQUEST_URI'];
  4. $doc_root = $_SERVER['DOCUMENT_ROOT'];

  5. $file = $doc_root.$uri;
  6. echo $file."\n";
  7. if(is_file($file)){
  8.   echo "File Clear...";
  9.   @unlink($file);
  10. }else{
  11.   echo "File Not Found...";
  12. }
  13. ?>
复制代码


以上方式就兼容squid的PURGE方式了,很方便的~

另外说一下Ncache:

Ncache也是不错的项目,是新浪的公司项目。
测试过32位的版本,有不满意的地方:
1 文件缓存有不完整的情况
2 proxy_pass就触发此功能,不能使用proxy_store了,以上说的功能不兼容
3 发现多次 kill -HUP 导致死掉服务

与开发的负责人闲聊一些,听闻64位现在是主要维护对象,文件不完整情况应该做了改善,有兴趣的朋友可以试试
不过阿权没有64位的机器来测试了,我的都是32位的老机器啊,可怜~~

评分

参与人数 1威望 +2 收起 理由
birder + 2 谢谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-7-13 01:22 , Processed in 0.112997 second(s), 13 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表