web缓存是位于web服务器和客户端之间的一层服务。当用户访问一个URL时,web缓存服务器会去后端web源服务器取回要输出的内容。下一个请求到来时,如果访问的是相同的URL,缓存服务器直接输出内容给客户端,而不是去源服务器取内容
proxy_cache 把 URL 及相关组合当作 Key, 用 md5 算法对 Key 进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目录内。目前只能对指定的URL或者状态码设置缓存过期时间
想清除指定 url的缓存,需要通过一个第三方模块:ngx_cache_purge,Nginx 无法动态加载模块,所以要使用 ngx_cache_purge 就必须在编译时就加上该模块
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz tar zxf ngx_cache_purge-2.3.tar.gz cd nginx-1.8.0 ./configure <旧的编译参数,可使用-V查看> --add-module=../ngx_cache_purge-2.3 make /usr/local/nginx/sbin/nginx -s stop cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak cp ./objs/nginx /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx 假设一个url为http://www.heboan.com/test.gif,通过访问http://www.heboan.com/purge/test.gif可以清除该URL缓存
nginx配置
upstream imooc { server 192.168.88.2:80; server 192.168.88.3:80; server 192.168.88.4:80; } proxy_cache_path /opt/app/cache levels=1:2 keys_zone=imooc_cache:10m max_size=10g inactive=60m use_temp_path=off; /opt/app/cache #存放缓存文件的目录 levels=1:2 #一般建议缓存目录按两层的目录来分级 keys_zone=imooc_cache:10m #imooc_cache是我定义的zone的名字,后面调用的就是这个名字 #10m表示大小10MB,1MB大概可以存储8千个key,10m就是8万个,这个我们可以根据实际情况设置 max_size=10g #表示控制/opt/app/cache目录最大为多大,因为我们不可能让它无限增长,把磁盘撑满,当用满之后,nginx就会实行淘汰规则 inactive=60m #表示不活越的,这里的60m表示的是60分钟,表示60分钟内,如果这个缓存文件没有被访问机会被清理掉 use_temp_path=off #建议把临时文件关闭,如果不关闭会有一些性能损耗 server { listen 80; server_name www.imooc.com; access_log /var/log/nginx/imooc_proxy.access.log main; location ~ /purge(/.*) { #清除缓存 allow 127.0.0.1; allow 192.168.1.0/24; deny all; proxy_cache_purge cache_one $host$uri$is_args$args; } location / { proxy_cache imooc_cache; #表示开启前面定义的缓存imooc_cache proxy_pass http://imooc; proxy_cache_valid 200 304 12h; #表示状态码为200,304是12小时后过期 proxy_cache_valid any 10m; #除了200和304以外的是10分钟后过期 proxy_cache_key $host$uri$is_args$args; #缓存的key add_header Nginx-Cache "$upstream_cache_status"; #增加的头信息,告诉客户端是否命中 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; #当后端某一台服务器返回错误的状态信息,则跳过这台,访问其他服务器 include proxy_params; } }