刚开始以为也不太好弄,让他用程序区处理,实际上稍微动脑筋分析一下也能够不修改程序实现动态生成缩略图且可以访问原图。 nginx
前提是须要定好图片的访问规则。 缓存
先来看一下什么是nginx的image filter模块。 测试
HttpImageFilterModule用来裁剪过大的图片到指定大小,是nginx自带模块,默认不会开启
开启HttpImageFilterModule须要在编译要带上参数 --with-http_image_filter_module spa
该模块主要有两个指令:
语法: image_filter (test | size | resize width height | crop width height)
默认是: 无
可出现的上下文: location code
该指令指定图像的转化形式: server
test - 测试回复是不是JPEG、GIF、或PNG图片(不支持BMP等其余格式),出错时返回415。
size - 返回图片的JSON数据,好比:( "Img": ( "width": 100, "height": 100, "type": "gif"))
resize - 根据设置按比例得减少图像,好比100*100的图片,而设置是50*25,减少后的图片为25*25。若是你只想设置一个维度,能够用“-”代替。出错时返回415。
crop - 根据设置按比例得减少图像,而后裁剪成跟设置同样大小的图片。好比100*100的图片,而设置是50*25,减少后的图片为50*50,Nginx会选取中间高度25的像素,造成50*25的图片,因此图片会有缺失。若是你只想设置一个维度,能够用“-”代替。出错时返回415。 图片
语法: image_filter_buffer size
默认值: image_filter_buffer 1M
可出现的位置: http, server, location it
该指令设置单图片缓存的最大值,若是过滤的图片大小超过缓存大小,会报错返回415。 io
如今开始时重点: 编译
有了如上认识再配合locaiont、if、image_filter 就能够让nginx动态生成缩略图了。
假设你的图片位于/img目录下
访问缩略图方式
http://www.xxx.cn/img/9GUMJR7200AJ0003_90x90.jpg
访问原图方式
http://www.xxx.cn/img/9GUMJR7200AJ0003_90x0.jpg
http://www.xxx.cn/img/9GUMJR7200AJ0003_0x50.jpg
http://www.xxx.cn/img/9GUMJR7200AJ0003_0x0.jpg
http://www.xxx.cn/img/9GUMJR7200AJ0003.jpg
添加以下配置到server上下文便可
location ~* /img/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ { set $h $2; set $w $3; if ($h = "0") { rewrite /img/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ /img/$1.$4 last; } if ($w = "0") { rewrite /img/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ /img/$1.$4 last; } #根据给定的长宽生成缩略图 image_filter resize $h $w; #原图最大2M,要裁剪的图片超过2M返回415错误,须要调节参数image_filter_buffer image_filter_buffer 2M; #error_page 415 /img/notfound.jpg; try_files /img/$1.$4 /img/notfound.jpg; } location ~* /img { }
http://wiki.nginx.org/HttpImageFilterModule