nginx 图片缓存

kevin.Zhu 发布于:2013-1-16 13:57 分类:Nginx  有 13 人浏览,获得评论 0 条  

最近准备用nginx搭建了一个图片服务器,看中的就是nginx超强的静态文件处理能力。


由于图片量比较大,和web服务器(也是nginx)分开运行,虽然web服务器调用图片没用问题,但毕竟是远程调用,肯定没有本地文件系统那么快,因此仍然有优化的空间。


使用前的nginx配置


1

2

3

4

5

location ~* ^.+\.(js|ico|gif|jpg|jpeg|png|html|htm)$ {

    log_not_found off;

    access_log off;

    expires 7d;

}


接下来就用到了nginx的proxy_store模块,让nginx 将取得的图片缓存在本地一个目录,下次就直接调用,(这让网页热点图片统计变得非常容易,讨厌日志分析的管理员肯定喜欢)


1

2

3

4

5

6

7

8

9

10

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|html|htm|css)$ {

           log_not_found off;

           expires 7d ;

           access_log off;

           proxy_store on;

           proxy_store_access user:rw group:rw all:rw;

            if ( !-e $request_filename) {

           proxy_pass  http://img.example.com

           }

}


默认的缓存路径位于 /var/cache/nginx/proxy_temp,里面将会保持图片服务器的目录结构


proxy_store 没有缓存过期,相当于镜像功能,这既是优点也是缺点,优点是访问快速,缺点是不知哪一天,硬盘会被撑爆,不过我们可以写个find脚本,定时清理一下缓存就OK了。


nginx还有一种缓存proxy_cache,它在设计上比proxy_store 更先进,采用内存+硬盘方式缓存,可以设置缓存大小和缓存过期。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

http {

    ,,,,,

    proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=imgcache:100m inactive=1d max_size=10g;

    server {

    ........

        location ~* ^.+\.(js|ico|gif|jpg|jpeg|png|html|htm)$ {

        log_not_found off;

        access_log off;

        expires 7d;

        proxy_pass http://img.example.com ;

        proxy_cache imgcache;

        proxy_cache_valid 200 302 1d;

        proxy_cache_valid 404 10m;

        proxy_cache_valid any 1h;

        proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

        }

    }

}

上面的代码将会使用一块最大100M的共享内存,用于硬盘上的文件索引,包括文件名和请求次数,每个文件在1天内若不活跃(无请求)则从硬盘上淘汰,硬盘缓存最大10G,满了则根据LRU算法自动清除缓存。


这种缓存方式为了更快的索引,采用hash分级来存储图片,图片目录结构和名称都变得面目全非,因此网页热点图片,必须通过其他途径统计,比如日志。


后一种方式更像一种正儿八经的缓存系统,应用相对更广,在性能上也更好。