回到nginx的cache_store方式上来。这是传统的nginx缓存方式,配置一般如下:
upstream test{
server 211.152.60.180:80;
}
server {
listen 80;
server_name images6.static.com;
location / {
root /cache/images6.static.com/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /cache/temp;
if (!-f $request_filename) {
proxy_pass http://test;
}
}
}
很简单明了。不过如果如果碰上img[1-16].static.com这样的客户,难不成把这一大段复制粘贴上16遍?汗~~必然得采用泛域名方式了。
server_name 支持.static.com的方式,root也支持/cache/$host/没有问题,save&&reconfigure,wget试一下,却没能缓存住。
于是去翻nginx官方wiki,刚巧看到proxy_store语法,除了on和off这两个想当然的赋值外,还有一个path!原文如下:
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;
赶紧换上,测试果然成功!conf如下:
upstream test{
server 211.152.60.180:80;
}
server {
listen 80;
server_name .anjukestatic.com;
location / {
root /cache/$host/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_store /cache/$host$uri;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /cache/temp;
if (!-f $request_filename) {
proxy_pass http://test;
}
}
}
测试日志记录如下:
1268456455.505 -/200 101 GET http://images6.static.com/property/20090911/600x600.jpg PARENT/211.152.60.180:80 "-" "Wget/1.10.2 (Red Hat modified)"
1268456586.371 -/200 101 GET http://images6.static.com/property/20090911/600x600.jpg PARENT/- "-" "Wget/1.10.2 (Red Hat modified)"
1268456631.414 -/200 45 GET http://images9.static.com/property/20100103/420x315.jpg PARENT/211.152.60.180:80 "-" "Wget/1.10.2 (Red Hat modified)"
1268456632.231 -/200 45 GET http://images9.static.com/property/20100103/420x315.jpg PARENT/- "-" "Wget/1.10.2 (Red Hat modified)"
不知道为什么,这个$upstream_cache_status居然一直是-,郁闷一下下。
另,刚开始只写proxy_store /cache/$host;也不行,后来看error.log中提示
“rename() "/cache/temp/0000000001" to "/cache/images6.static.com/" failed (20: Not a directory)”
才知道必须加上$uri。官方文档写的是$original_uri,日志里写的是$request_uri,nginx的内置变量有时候真的让人有些头晕…… 思路跳回上篇的大小写,或许用下面这个办法可以?
perl_set $url '
sub {
my $r = shift;
my $re = lc($r->uri);
return $re;
}
';
proxy_store /cache/$host$url;
#proxy_cache_key $host$url$is_args$args;
未经试验,目前猜测,可能结果是nginx回源下载新文件,然后覆盖掉原来的——也就是说达到节省磁盘的目的,但HIT/MISS照旧。