之前一直都使用memcached做缓存,最近想尝试一下Nginx的proxy_cache缓存方式,proxy_cache可以根据指定key的组合方案生成MD5哈希把页面结果存储在磁盘上,跟大多综合站点的生成静态页的缓存方式一样。proxy_cache方式跟memcached内存级别的缓存还是不能比拟,但Nginx目前还不能做memcached的write动作,所以简单配置proxy_cache也能抵挡不少鸭梨。
没有配置好proxy_cache
但在网络上搜索几篇文章以后,发现大家写的很模糊,很多文章都是抄袭复制品。所以按照网络上的教程,我一开始是这么配置的,在http段增加:
proxy_cache_path /tmp/qttc_cache levels=1:2 keys_zone=qttc:200m inactive=1d max_size=10g;
然后在server中找到你要缓存的location,增加:
proxy_cache qttc;
意思表示开启这个location的缓存,但是我重启Nginx以后,重新访问站点发现在缓存目录下并没有生成缓存文件。于是,我首先这么做:
- 1、会不会是浏览器有缓存,于是我清空浏览器,甚至使用其它浏览器访问站点,并且按狂刷。结果还是没有生成静态文件。
- 2、会不会是Nginx自动判断我的内容,太少就不会缓存。于是我赋值了一大堆字符串到一个文件中,然后使用浏览器狂访问那个文件,结果还是没有生成静态文件
于是到网上搜索,结果也没有搜索到有用的信息。难道我安装的Nginx有问题?重新从官网下载编译安装,还是没有解决问题。
原来是这样工作的
后来不断的摸索,仔细研究。发现还要添加以下两条才能让proxy_cache工作
proxy_cache_valid 200 304 302 24h;
指定各个状态码下缓存的时间,200是很重要的,如果有其它的要缓存可以在后边加上
proxy_pass https://www.qttc.net;
指定获取静态内容的地址,其实proxy_cache的原理就是从一个你指定的地址获取内容,然后缓存。当下次你访问时,Nginx会自动判断有没有缓存文件?如果有的话缓存文件是不是已经过期(缓存文件的有效期就是第一条设置的)?如果前面两条任何一条成立就会从proxy_pass的地址重新获取页面信息。
于是经过配置以后,终于能生成缓存文件了:
[root@lee qttc_cache]# ll
总用量 24
drwx------ 3 www www 4096 7月 19 08:55 4
drwx------ 5 www www 4096 7月 19 08:55 8
drwx------ 3 www www 4096 7月 19 08:55 a
drwx------ 3 www www 4096 7月 19 08:55 c
drwx------ 3 www www 4096 7月 19 08:55 d
drwx------ 3 www www 4096 7月 19 08:55 e
可惜,如果你要清空缓存,可以在后台加一个功能使用后端语言删除,或者使用一个Purge插件通过IP加端口访问的方式来清楚缓存文件。
最后
如果你要删除某一个URL的缓存文件,就比较悲催了。但也不是不能做到。因为Nginx生成URL文件的时候,存放的目录以及生成的哈希文件名都是固定的,你也可以使用proxy_cache_key来指定生成的key的字段内容。
如果你掌握它的生成规则,你就可以写一个管理器来快速清空单个URL缓存。最烂的方法也可以把缓存目录清空,接着访问你要需要单独清空的URL,然后再到缓存目录里看看生成的缓存目录与文件名,再你需要单独清空这个URL的缓存时直接把文件干掉就好
因为proxy_cache需要proxy_pass配置才能生成缓存内容,而目前一般的站点配置中,比如PHP站点都是把PHP页面proxy_pass到php-fpm程序处理,所以你可以在处理php的location里加上proxy_cache把php动态语言生成的内容结果缓存。对于那些静态文件其实也不需要什么proxy_cache来缓存,因为静态文件跟proxy_cache最终生成的缓存文件一样都是在磁盘上的一个文件。