Nginx?缩略图?两个貌似不搭边儿的词语怎么可以关联到一起?但nginx自0.75版本增加了实时转换图片的功能⋯⋯换句话说,假如服务器上存储的是大图,要想展示给用户一张缩略图,可以通过nginx进行实时转换,而不用生成实体文件,这样可以很大程度的节省磁盘空间资源。
nginx的默认编译中不支持此功能,需要在编译的时候增加 –with-http_image_filter_module 参数。如果之前安装过,就需要重新编译了。编译之前最好备份一下配置文件:
cp /usr/local/webapp/nginx/conf/nginx.conf /usr/local/webapp/nginx/conf/nginx.conf.bak
编译安装:
root@n3yang:~# cd /root/soft/
root@n3yang:~# tar zxf nginx-0.8.29.tar.gz
root@n3yang:~# cd nginx-0.8.29
root@n3yang:~# ./configure --user=www --group=www --prefix=/usr/local/webapp/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module
root@n3yang:~# make;make install
安装完成后,需要配置nginx转换哪些图片到什么样的尺寸。
假定原图地址为 http://avatar.n3yang.com/1.jpg
转化后图片路径为 http://avatar.n3yang.com/1_(width)x(height).jpg
如果头像文件不存在,将显示默认的头像:default-avatar.jpg
括号中的width与height分别为欲转化的图片宽度和高度。例如宽为45高为65的头像,那头像地址为http://avatar.n3yang.com/1_45x65.jpg
在配置文件nginx.conf 添加配置:
location ~ /(\d+)_(\d+)x(\d+)\.(JPG|jpg|GIF|gif|PNG|png)$ {
if (!-f /$1.$4) {
rewrite ^ /default-avatar.jpg break;
}
image_filter resize $2 $3;
image_filter_buffer 2M;
}
重新载入配置文件后才能生效。
几点说明:
1、生成缩略图只是image_filter功能中的一个,它一共支持4种参数:
test:返回是否真的是图片
size:返回图片长短尺寸
corp:截取图片的一部分
resize:缩放图片
2、可以实现backend server的图片转换。对于访问量不大,但是需求多种尺寸的网站可以使用1台图片服务器作为原图存储,在展示时使用nginx进行实时转换,以节省空间资源。
3、对于大访问量的站点,可以在nginx之前再搭建一台vanish做缓存。由vanish分担并发压力,nginx仅在图片被第一次访问时生成缩略图。这样便可以在很大程度上节省了服务器空间。这种设计也有一个问题,就是在vanish崩溃、重启之后,缓存未生成,大量图片需要进行实时转换,nginx的压力一定会很大。