动态创建缩略图
Contents
起因
线上DSP 产品, 因为比较多图片资源, 每次都浏览原图(虽然有最大 5M 限制), 这样子一来体验很不好, 其次占用不少带宽, 导致后台一些任务上传到 ADX 时经常超时. 所以加了个生成缩略图的功能.
但历史数据也比较多, 约 22G, 如果要处理旧数据, 那就要占用不少磁盘空间了. 所以就有了个动态生成缩略图的处理方案.
方案
主要思路是 nginx -> error page 404 -> rewrite -> 后端 -> 生成一下 -> 返回
这样子就可以兼容旧数据的处理了.
nginx 的配置:
location ^~ /res/ {
root /tmp/static/;
error_page 404 @img_proxy;
#expires定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
#expires 1d;
}
location @img_proxy {
rewrite ^/(.*)$ /appError404?url=$uri;
}
然后在后端中处理 /appError404?url=xxx
的请求了.
线上旧数据的请求是 /res/static/xxxx.jpg
(原图). 现在有三个 URL 了.
- 缩略图:
/res/static/thum/xxxx.jpg
- 大图 :
/res/static/big/xxxx.jpg
- 原图 :
/res/static/xxxx.jpg
让前端统一默认显示缩略图, 所以旧的数据的路径变成了 /res/static/thum/xxxx.jpg
. 这时, nginx 返回的是 404, 然后重定向到 @img_proxy
指定的重写规则, 进入到后端的 /appError404
请求处理. 这时, 在该代码里为路径 /res/static/thum/xxx.jpg
生成一份缩略图. (源文件为 /res/static/xxxx.jpg
)