Nginx?.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作KeyQ用md5~码哈希后保存在盘上,所以它可以支持LURL链接Q同时也支持404/301/302q样的非200状态码。虽然目前官方的Nginx Web~存服务只能为指定URL或状态码讄q期旉Q不支持cMSquid的PURGE指oQ手动清除指定缓存页面,但是Q通过一个第三方的Nginx 模块Q可以清除指定URL的缓存?/p>
Nginx的Web~存服务主要由proxy_cache相关指o集和fastcgi_cache 相关指o集构成,前者用于反向代理时Q对后端内容源服务器q行~存Q后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一栗?/p>
最新的Nginx 0.8.31版本Qproxy_cache和fastcgi_cache已经比较完善Q加上第三方的ngx_cache_purge模块Q用于清除指?URL的缓存)Q已l可以完全取代Squid。我们已l在生环境使用?Nginx ?proxy_cache ~存功能过两个月,十分E_Q速度不逊于 Squid?/p>
在功能上QNginx已经具备Squid所拥有的Web~存加速功能、清除指定URL~存的功能。而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健h查、后端服务器故障转移?Rewrite重写、易用性上QNginx也比Squid强大得多。这使得一台Nginx可以同时作ؓ“负蝲均衡服务?#8221;?#8220;Web~存服务?#8221;来用?/p>
Nginx的基依赖{这里就不再安装了,我们直接从Nginx开始?/p>
以上安装成功了Q下面就是设|?home/nginx/conf/nginx.conf文g了?br /> 下面的命令实在http模块里面Q但是又在server模块之上?/p>
levels指定该缓存空间有两层hash目录Q第一层目录是1个字母,W二层ؓ2个字母,保存的文件名׃cM/tmp/nginx_cache/0/da/9cebc9546cefbf52275a01317d96cda0 ;keys_zone个空间v个名字,比如上面的cache_oneQ?00m指空间大ؓ200MB;inactive?0m指缓存默认时?0分钟;max_size?m是指单个文g过5m的就不缓?clean_time指定一分钟清理一ơ缓存?/p>
接下来就是在server模块里面配置cache了?/p>
上面的例子是说HTTP CODE?00Q?04Q?01Q?02的都~存一个小Ӟ使用的缓存名U是cache_oneQ就是在http里面定义的缓存名U。其它类型的~存旉?分钟。缓存的文g名是L?地址+参数。比如说我们q去看看我们的缓存文Ӟ在目?tmp/nginx_cache中:
最后我们用ngx_purge_module来开放一个地址出来允许手动清除~存?/p>
在上面中$1pC我们要清除的地址(uriQ如果有参数Q需要参??/p>
好了我们来看一个效果?/p>
可以看到除了W一ơ用了252毫秒以外Q第二次W三ơ都没有p后端apache服务器的旉Q而且每次发送的字节内容是固定的。实际上q里/p/227.html是wordpress动态生成的内容Q默认地址应该?id=227,只不q我URL重写了,便于搜烦引擎爬去而已?/p>
然后我们使用地址/purge/p/227.html来清除缓存?/p>
然后再访问就可以看到没有~存了?/p>
当然了,如果想php/jsp{不使用~存Q那么就配一个locationQ同时不配置proxy_cache卛_。location的条件可以如下:
语法: location [=|~|~*|^~|@] /uri/ { ... }
默认?/strong>: no
上下?/strong>: server
location可以配置依赖于URI的请求,Ҏ不同的规则将h转发到相应的后端服务器上。location的path规则支持正则表达式?Z使用正则表达式,必须使用下面的匹配符Q?/p>
匚w的规则是优先使用帔R字符Ԍ非正则表辑ּQ,如果M一个常量字W串匚w停止匹配,q回匚w的结果。如果常量字W串不匹配就匚w正则表达式,扑ֈW一个匹配的正则表达式规则就停止匚wQ返回匹配的l果。如果正则表辑ּ也不匚w匹配URL的PATHQ一U一U往上匹配,最l到/Q?/p>
"="仅仅匚wURI完全一L地址。显然正则表辑ּ的匹配速度是慢于字W串的直接匹配的Q所以如果一个地址是频J访问的话,使用"="可以提高匚w的速度?/p>
M一条不使用 "=" 或?"^~" 前缀的常量字W串规则匚wq卛_止终止匹配?结Q匹配规则如下:
特别的是Qnginx不匹配编码后的字W串Q比?/images/%20/test"中带有一个空|那么必须使用"/images/ /test"才能匚wQ而不是用编码后的字W?/p>
下面是一个例子?/p>
location = / { #仅仅匚w地址"/" [规则A] } location / { # 匚wM一个以"/"开头的地址Q所以说基本上匹配所有地址Q但是正则表辑ּ可能优先于此匚w? [规则B] } location ^~ /images/ { # 匚wM?/images"开头的地址Q此匚w规则要优先于正则表达式? [规则C] } location ~* \.(gif|jpg|jpeg)$ { # 匚wM?gif", "jpg", 或?.jpeg"l尾的地址。但?/images/"目录中的文g会被规则C优先匚w? [规则D] }
例如下面一些请求:
/ -> 规则A /documents/document.html -> 规则B /images/1.gif -> 规则C /documents/1.jpg -> 规则D
四种规则可以以Q何顺序在配置文g中定义,同一条规则多条正则表辑ּ匚wӞ依赖其在配置文g中的序。另外,嵌套的location可能D未知的匹配结果?/p>
另外Q前~"@" 比较特别Q用来处?a class="wikilink" style="text-decoration: none; ">错误面?a class="wikilink" style="text-decoration: none; ">试面Q多面旉序匹配规则)?/p>