【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。
好了,今天就聊到这儿吧!小伙伴们可以在下方留言。别忘了给个在看和转发,让更多的人看到,一起学习一起进步!!
写在最后
如果你觉得冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!

【Nginx】面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!的更多相关文章
- 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?
在Java基础中,集合类是很关键的一块知识点,也是日常开发的时候经常会用到的.比如List.Map这些在代码中也是很常见的. 个人认为,关于HashMap的实现,JDK的工程师其实是做了很多优化的,要 ...
- 面试官常问的Nginx的那几个问题?
什么是Nginx? Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代 ...
- 面试官常问的Nginx的几个问题
1.什么是Nginx? Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3 ...
- 我说精通字符串,面试官竟然问我 Java 中的 String 有没有长度限制?
String 是 Java 中很重要的一个数据类型,除了基本数据类型以外,String 是被使用的最广泛的了,但是,关于 String,其实还是有很多东西容易被忽略的. 就如本文我们要讨论的问题:Ja ...
- 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?|附视频讲解
关于String有没有长度限制的问题,我之前单独写过一篇文章分析过,最近我又抽空回顾了一下这个问题,发现又有了一些新的认识.于是准备重新整理下这个内容. 这次在之前那篇文章的基础上除了增加了一些验证过 ...
- 深度分析:面试90%被问到的 Session、Cookie、Token,看完这篇你就掌握了!
Cookie 和 Session HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录:Session 和 Cookie 的主要目的 ...
- JVM工作原理和特点(一些二逼的逼神面试官会问的问题)
作为一种阅读的方式了解下jvm的工作原理 ps:(一些二逼的逼神面试官会问的问题) JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完毕,通过以下4步来完毕JVM环境. ...
- 面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!
最近看了 @JavaGuide 发布的一篇『面试官问我如何保证Kafka不丢失消息?我哭了!』,这篇文章承接这个主题,来聊聊如何保证 RocketMQ 不丢失消息. 0x00. 消息的发送流程 一条消 ...
- 优雅手撕bind函数(面试官常问)
优雅手撕bind函数 前言: 为什么面试官总爱让实现一个bind函数? 他想从bind中知道些什么? 一个小小的bind里面内有玄机? 今天来刨析一下实现一个bind要懂多少相关知识点,也方便我们将零 ...
随机推荐
- 刷一遍《剑指Offer》,你还需要这些知识!(一刷)
因为时间紧和基础薄弱,一刷<剑指Offer>就变成了速看. 我按照: 1.看题目思考一会: 2.上网找找关于题目里不懂的知识点: 3.看评论和官方题解的解法,尽量看懂,并及时弄懂不懂的地方 ...
- css在 IE8下的兼容性
常用伪类选择器 IE7 IE8 IE9 :hover √ √ √ :focus × √ √ :first-child √ √ √ :last-child × × √ :first-of-type ...
- C#数据结构与算法系列(八):栈(Stack)
1.介绍 栈是一个先入后出(FILO-First In Last Out)的有序列表 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的特殊线性表.允许插入和删除的一端,为变化的一端,称为栈顶 ...
- skynet 初步分析
自己想实现一个tcp 粘包,残包的功能. 先看看一些开源的库是怎么实现的. 首先开启一个线程.使劲的执行: skynet_socket_poll skynet_socket_poll 这个玩意是干 ...
- HTTP协议简要
HTTP协议简要 HTTP协议是指超文本传输协议,简单来说就是一种规则,允许将HTML文档从Web服务器传送到Web浏览器. HTTP请求 HTTP请求包括三部分:请求行(请求方法),请求头(消息报头 ...
- Tensorflow2 自定义数据集图片完成图片分类任务
对于自定义数据集的图片任务,通用流程一般分为以下几个步骤: Load data Train-Val-Test Build model Transfer Learning 其中大部分精力会花在数据的准备 ...
- logback.xml 不能被加载,logback不能被执行,logback.xml 无法生效,slf4j日志样式输出失败
1. 原因 logback.xml 无法被加载, 尝试了好久还是失败,哎,最后新建工程竟然可以,所以说还是项目的问题: 原来项目依赖了两个slf4j.jar,是版本冲突了: 2. 查找原因 idea ...
- mysql性能优化总结(MySql避免重复插入记录的几种方法)
如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了:(area,age,salary),(area,age).(area)三个索引,这被称为最佳左前缀特性.因此我们在创 ...
- PHP时间处理汇总
PHP时间处理汇总 1.求上个月的开始时间和结束时间 <?php header('Content-Type: text/html; charset=utf-8'); // 上个月的开始时间 $b ...
- MongoDB快速入门教程 (4.3)
4.3.Mongoose模块化 4.3.1.为什么要进行模块化拆分? 模块化拆分的目的是为了代码的复用,让整个项目的结构更加清晰,举个例子:当数据库中的集合变多的时候,例如有课程.订单.分类.教师等多 ...