【Nginx】面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!

写在前面

今天想写一篇使用Nginx如何生成缩略图的文章,想了半天题目也没想好,这个题目还是一名读者帮我起的。起因就是这位读者最近出去面试,面试官正好问了一个Nginx如何生成缩略图的问题。还别说,就是这么巧呀!!就冲这标题,也要写一篇干货满满的技术好文!!

关于Nginx的安装,小伙伴们可以参考《【Nginx】实现负载均衡、限流、缓存、黑白名单和灰度发布,这是最全的一篇了!

还有就是,小伙伴们如果对文章有什么好的建议和意见,或者在阅读文章时,有什么疑问,都可以在留言区进行留言!!

生成缩略图方案

为了手机端浏览到与手机分辨率相匹配的图片,提高 APP 访问速度以及减少用户的手机流量,需要将图片生成缩略图,这边共有以下解决方案。

  • A.发布新闻生成多重缩略图 – 无法匹配到各种尺寸图片
  • B.当相应缩略图不存在,则使用 PHP 或者 Java 等程序生成相应缩略图 – 需要程序员协助
  • C.使用 Nginx 自带模块生成缩略图 – 运维即可完成
  • D.使用 Nginx+Lua 生成缩略图

经过多方的考虑,决定使用方案 C,使用 Nginx 自带模块生成缩略图。

Nginx生成缩略图

配置Nginx

使用 Nginx 自带模块生成缩略图,模块: --with-http_image_filter_module,例如,我们可以使用如下参数安装Nginx:

./configure --prefix=/usr/local/nginx-1.19.1 --with-http_stub_status_module --with-http_realip_module --with-http_image_filter_module --with-debug

接下来,修改 nginx.conf 配置文件,或者将下面的配置放到nginx.conf文件相应的 server 块中。

location ~* /(\d+)\.(jpg)$ {
	set $h $arg_h; # 获取参数h的值
	set $w $arg_w; # 获取参数 w 的值
	#image_filter crop $h $w;
	image_filter resize $h $w;# 根据给定的长宽生成缩略图
}
location ~* /(\d+)_(\d+)x(\d+)\.(jpg)$ {
	if ( -e $document_root/$1.$4 ) { # 判断原图是否存在
		rewrite /(\d+)_(\d+)x(\d+)\.(jpg)$ /$1.$4?h=$2&w=$3 last;
	}
	return 404;
}

访问图片

配置完成后,我们就可以使用类似如下的方式来访问图片。

http://www.binghe.com/123_100x10.jpg

当我们在浏览器地址栏中输入上面的链接时,Nginx会作出如下的逻辑处理。

  • 首先判断是否存在原图 123.jpg,不存在直接返回 404(如果原图都不存在,那就没必要生成缩略图了)
  • 跳转到 http://www.binghe.com/123.jpg?h=100&w=10,将参数高 h=100 和宽 w=10 带到 url 中。
  • Image_filter resize 指令根据 h 和 w 参数生成相应缩略图。

注意:使用Nginx生成等比例缩略图时有一个长宽取小的原则,例如原图是 100*10,你传入的是 10*2,那么Nginx会给你生成 10*1 的图片。生成缩略图只是 image_filter 功能中的一个,它一共支持 4 种参数:

  • test:返回是否真的是图片
  • size:返回图片长短尺寸,返回 json 格式数据
  • corp:截取图片的一部分,从左上角开始截取,尺寸写小了,图片会被剪切
  • resize:缩放图片,等比例缩放

Nginx 生成缩略图优缺点

优点:

  • 根据传入参数即可生成各种比例图片
  • 不占用任何硬盘空间

缺点:

  • 消耗 CPU
  • 访问量大将会给服务器带来比较大的负担

建议:

生成缩略是个消耗 CPU 的操作,如果访问量比较大的站点,最好考虑使用程序生成缩略图到硬盘上,或者在前端加上 Cache缓存或者使用 CDN。

好了,今天就聊到这儿吧!小伙伴们可以在下方留言。别忘了给个在看和转发,让更多的人看到,一起学习一起进步!!

写在最后

如果你觉得冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!

posted @ 2020-07-12 15:35  冰河团队  阅读(389)  评论(0编辑  收藏