起因

线上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)