使用Nginx作缓存服务器以及删除其缓存文件的方法
使用nginx做cache服务器
需求就是缓存android的软件包,后缀名是apk。话不多说,直接上配置,供参考:
a-->nginx.conf userwwwwww; worker_processes8; error_log/data/logs/nginx_error.logcrit; pid/usr/local/nginx/nginx.pid; worker_rlimit_nofile204800; events { useepoll; worker_connections204800; } http { includemime.types; #apk文件类型 #default_typeapplication/vnd.android.package-archive; default_typeapplication/octet-stream; charsetutf-8; server_names_hash_bucket_size128; client_header_buffer_size2k; large_client_header_buffers44k; client_max_body_size8m; sendfileon; tcp_nopushon; keepalive_timeout60; open_file_cachemax=204800inactive=20s; open_file_cache_min_uses1; open_file_cache_valid30s; tcp_nodelayon; client_body_buffer_size512k; #跟后端服务器连接的超时时间_发起握手等候响应超时时间 proxy_connect_timeout600; #连接成功后_等候后端服务器响应的时间_其实已经进入后端的排队之中等候处理 proxy_read_timeout600; #后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有数据 proxy_send_timeout600; #代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可 proxy_buffer_size16k; #同上告诉Nginx保存单个用的几个Buffer最大用多大空间 proxy_buffers464k; #如果系统很忙的时候可以申请更大的proxy_buffers官方推荐*2 proxy_busy_buffers_size128k; #proxy缓存临时文件的大小 proxy_temp_file_write_size128k; gzipon; gzip_proxiedexpiredno-cacheno-storeprivateauth; gzip_min_length1k; gzip_buffers416k; gzip_http_version1.1; gzip_comp_level3; gzip_typestext/plainapplication/x-javascripttext/cssapplication/xml; gzip_disable"MSIE[1-6]\."; gzip_varyon; #log_formataccess'$remote_addr-$remote_user[$time_local]' #'"$request"$status$body_bytes_sent' #'"$http_referer""$http_user_agent"' #'$host$request_time$http_x_forwarded_for'; #access_log/data/logs/http.a.log; #error_log/data/logs/http.e.log; includevhosts/cache.peiqiang.net.conf; } upstreamsource_site{ server192.168.1.1:80weight=7max_fails=2fail_timeout=30s; server192.168.1.2:80weight=4max_fails=2fail_timeout=30s; } b-->cache.peiqiang.net.conf #用于指定本地目录来缓冲较大的代理请求 proxy_temp_path/data/soft/temp; #设置web缓存区名为cache_one,内存缓存空间大小为12000M,自动清除超过15天没有被访问过的缓存数据,硬盘缓存空间大小200g proxy_cache_path/data/soft/cachelevels=1:2keys_zone=cache_one:12000minactive=15dmax_size=200g; server{ listen80; server_namecache.peiqiang.net; access_log/data/logs/a.log; error_log/data/logs/e.lognotice; #PHPScriptsisNOTallowedwithinthissite! location~*\.(php|php5|jsp|asp|aspx)${ denyall; } location/{ proxy_next_upstreamhttp_500http_502http_503http_504errortimeoutinvalid_header; proxy_cachecache_one; proxy_cache_valid20030412h; proxy_cache_key$uri$is_args$args; #反向代理,访问后端内容源服务器 proxy_set_headerHost$host; proxy_set_headerX-Forwarded-For$remote_addr; proxy_passhttp://source_site; } location~*.*\.(apk)${ error_page302404=@fallback; #如果后端的服务器返回500、502、503、504执行超时等错误、自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移 proxy_next_upstreamhttp_500http_502http_503http_504errortimeoutinvalid_header; #使用web缓存区cache_one proxy_cachecache_one; #对不同的HTTP状态码缓存设置不同的缓存时间 proxy_cache_valid20030412h; #设置Web缓存的Key值,Nginx根据Key值md5哈希存储缓存,这里根据"域名、URI、参数"组合成key proxy_cache_key$uri$is_args$args; #反向代理,访问后端内容源服务器 proxy_set_headerHost$host; proxy_set_headerX-Forwarded-For$remote_addr; proxy_passhttp://source_site; expires1d; } location@fallback{ rewrite^$scheme://apke.peiqiang.net$uriredirect; expires-1; } }
说明:其实按这个配置location/这个匹配是多余的,因为过来一个后缀名为apk的软件包location~*.*\.(apk)$已经给匹配上了,不会再到location/了,不过由于我们还会缓存些其他后缀名的文件,所以location/就是必须的。
c-->/etc/rc.local #!/bin/sh # #Thisscriptwillbeexecuted*after*alltheotherinitscripts. #Youcanputyourowninitializationstuffinhereifyoudon't #wanttodothefullSysVstyleinitstuff. touch/var/lock/subsys/local ulimit-HSn65535 /usr/local/nginx/sbin/nginx
删除nginx缓存文件
一:脚本
ashell版
#!/bin/bash #Date:2013-06-27 #Auther:budong ####################################################### #说明: #1.本脚本用于清除nginx缓存文件 #2.查看你的nginx是根据什么作为key来hash的,我的设置是proxy_cache_key$uri$is_args$args; #因此nginx会根据$uri$is_args$args作为key进行hash,因此可以模拟nginx对一个key进行再 #hash找到相应的文件路径,删除(具体可随意找个缓存文件more一下看看) #3.缓存设置proxy_cache_path/data/mumayi/cachelevels=1:2keys_zone=cache_one:6000minactive=15dmax_size=200g; #根据相应的配置,请做相应修改测试 #4.uri格式请按照同级目录下rm_apk_list.txt中填写 ##################################################### whileread-rline do md5uri=`echo-n$line|md5sum|awk'{print$1}'` filepath=`echo"$md5uri"|awk'{print"/data/mumayi/cache/"substr($0,length($0),1)"/"substr($0,length($0)-2,2)"/"$0}'` rm-rf$filepath done</root/sbin/rm_apk_list.txt bpython版 #!/usr/local/python2.7/bin/python2.7 #-*-coding:utf8-*- #Date:2013-06-26 #Name:budong ''' 说明: 1.本脚本用于清除nginx缓存文件 2.查看你的nginx是根据什么作为key来hash的,我的设置是proxy_cache_key$uri$is_args$args; 因此nginx会根据$uri$is_args$args作为key进行hash,因此可以模拟nginx对一个key进行再 hash找到相应的文件路径,删除(具体可随意找个缓存文件more一下看看) 3.缓存设置proxy_cache_path/data/mumayi/cachelevels=1:2keys_zone=cache_one:6000minactive=15dmax_size=200g; 根据相应的配置,请做相应修改测试 4.uri格式请按照同级目录下rm_apk_list.txt中填写 ''' importos importsys try: fromhashlibimportmd5 except: frommd5importmd5 reload(sys) sys.setdefaultencoding('utf-8') PROJECT_ROOT=os.path.dirname(os.path.abspath(__file__)) URI_FILE=''.join([PROJECT_ROOT,'/rm_apk_list.txt']) defnginx_purge(uri): m=md5() m.update("%s"%uri) md5uri=m.hexdigest() md5uri_len=len(md5uri) dir1=md5uri[md5uri_len-1:] dir2=md5uri[md5uri_len-3:md5uri_len-1] file_path=("/data/mumayi/cache/%s/%s/%s"%(dir1,dir2,md5uri)) ifos.path.exists(file_path): os.remove(file_path) withopen("%s"%URI_FILE,'r')asuri_file: forlineinuri_file: line=line.rstrip() nginx_purge(line)
cngx_cache_purge不做考虑,据说已经停止开发了
说明:
1我的/root/sbin/rm_apk_list.txt文件
[root@budong~]#cat/root/sbin/rm_apk_list.txt /2013/08/15/38/382272/shuazanzhushou_V1.8.16_mumayi_95a91.apk
2查看一个缓存对象,应该有些明白了吧
[root@budong~]#more/data/mumayi/cache/0/00/db9327b60a6b3c164516117f90d9d000
KEY:/2013/10/23/43/432816/dinuochongwuDinoPets_V1.1.1_mumayi_0b399.apk HTTP/1.1200OK Server:nginx/1.2.6 Date:Sun,15Dec201319:51:22GMT Content-Type:application/vnd.android.package-archive Content-Length:37466293 Connection:close Last-Modified:Wed,23Oct201306:15:06GMT Expires:Wed,18Dec201317:35:07GMT Cache-Control:max-age=604800 Accept-Ranges:bytes