• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

OpenResty(Nginx)+Lua+GraphicsMagick实现缩略图功能

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 http://www.hopesoft.org/blog/?p=1188

 

http://www.imagemagick.org/download/

 

 

一、背景说明
大多数网站基本都涉及到图片缩略图的处理,比如新闻配图、电商商品图等,特别是电商类网站,每个商品图对应多个不同尺寸的缩略图,用于不同的页面。

初期访问量少时,处理流程一般由web程序在上传成功后,同时生成相应缩略图。这种方式在访问量小,单机部署时没有问题。当访问量逐渐加大,服务器由单台变为多台时,这种方式扩展性较差。

以下有几种方案可以解决这个问题:
1、使用七牛又拍云提供的云存储及数据处理服务,解决图片的处理、存储、多节点访问速度的问题,这种方式优点是方案成熟,相应的有一定费用和开发工作,另外有一些小概率的风险,比如云服务挂掉影响本站访问。
2、使用第三方的图片处理程序,比如zimg,点击查看使用手册@招牌疯子开发。zimg的性能和扩展性不错,文档也很完善,会继续保持关注。
3、自己造轮子,根据自身业务,将生成缩略图功能独立出来,与web程序解耦。

我们采用的是第三种方案,参考了网友的基础代码,利用OpenResty(Nginx)+Lua+GraphicsMagick实现缩略图功能,图片上传及删除还是由web程序处理,缩略图由单独模块完成。目前可实现配置路径及缩略尺寸,无图片时显示默认图片,支持多种缩放方式等,后续可基于GraphicsMagick实现更多功能

 

二、相关规范
1、文件夹规划

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.org
avatars
001
001.jpg
default
.jpg
photos
001
001.jpg
thumbnail
photos
001
001_100x100.jpg
001_140x140.jpg
001_250x250.jpg
001_300x300.jpg
001_350x350.jpg
001_50x50.jpg
.jpg

其中img.hopesoft.org为图片站点根目录,avatars和photos目录是原图目录,可根据目录设置不同的缩略图尺寸,default文件夹的notfound.jpg文件是在未找到原图时的默认图片,thumbnail文件夹用来存放缩略图,可定时清理。

2、链接地址
原图访问地址:http://img.hopesoft.org/photos/001/001.jpg
缩略图访问地址:http://img.hopesoft.org/photos/001/001_100x100.jpg,(请勿加thumbnail,这个是因为我们原来的原图和缩略图在同一个目录,后来将缩略图单独放了一个文件夹)
不同目录可设置不同的缩略图规则,如:
原图访问地址:http://img.xxx.com/mall/001/001.jpg
缩略图访问地址:http://img.xxx.com/mall/001/001.jpg_100x100.jpg (请勿加thumbnail)

3、访问流程
首先判断缩略图是否存在,如存在则直接显示缩略图;
如不存在则按以下流程处理:

  1. 判断缩略图链接与规则是否匹配,如不匹配,则404退出;如匹配跳至2
  2. 判断原图是否存在,如原图存在则跳至5,如不存在则进入下一步;
  3. 判断是否显示默认图片,如不显示则404退出;如显示则进入下一步
  4. 判断是否存在默认图片,如不存在则404退出;如存在则将默认图片代替原始图片,进入下一步;
  5. 拼接graphicsmagick命令,生成并显示缩略图

三、安装OpenResty
1、关于OpenResty(http://openresty.org/cn/

OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器,它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。
OpenResty 通过汇聚各种设计精良的 Nginx 模块,
从而将 Nginx 有效的变成一个强大的 Web 应用服务器,
这样, Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种C以及Lua 模块,
快速构造出足以胜任 10K+ 并发连接响应的超高性能Web 应用系统。更多

2、安装OpenResty
注:drizzle-nginx-module模块和nginx-http-concat模块非必选项,各位可按需安装

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#创建安装文件目录
nginx
nginx
 
#安装drizzle模块(访问mysql数据库模块,非必需,建议安装)
2011.07.21.tar.gz
2011.07.21.tar.gz
2011.07.21
server
1.0
1.0
.
 
#下载openresty
1.4.2.7.tar.gz
1.4.2.7.tar.gz
 
#下载nginx-http-concat(合并静态文件请求模块,非必需,建议安装)
.zip
master
concat
 
#安装openresty
1.4.2.7
/
gmake
install

3、将OpenResty(Nginx)加入自启动

 
1
nginx

文件内容如下

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run 'update-rc.d -f nginx defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: 'chkconfig --add nginx'
 
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO
 
 
bin
nginx
$NAME
.conf
.pid
$NAME
 
e
0
 
{
}
 
{
}
 
{
}
 
in
)
do_start
;
)
do_stop
;
)
do_reload
;
)
do_stop
do_start
;
)
2
3
;
esac
 
0

把nginx加入chkconfig,并设置开机启动

 
1
2
nginx
on

启动、停止、查看状态

 
1
2
3
start
stop
status

四、安装GraphicsMagick
1、安装

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#创建安装目录
graphicsmagick
graphicsmagick
 
#下载graphicsmagick
//sourceforge.net/projects/graphicsmagick/files/graphicsmagick/1.3.18/GraphicsMagick-1.3.18.tar.gz/download
1.3.18.tar.gz
#下载libjpeg
//ftp.pl.freebsd.org/vol/rzm1/GraphicsMagick/delegates/libjpeg-6b.tar.gz
libjpeg
allmatches
6b.tar.gz
6b
configure
make
install
/
/
.
 
#安装libpng
libpng
allmatches
//ftp.pl.freebsd.org/vol/rzm1/GraphicsMagick/delegates/libpng-1.2.49.tar.gz
1.2.49.tar.gz
1.2.49
configure
make
install
/
/
/
 
#安装freetype
//ftp.pl.freebsd.org/vol/rzm1/GraphicsMagick/delegates/freetype-2.4.10.tar.gz
2.4.10.tar.gz
2.4.10
configure
install
/
/
.
 
#安装GraphicsMagick
1.3.18
1.3.18
make
install
 
#编辑profile文件
profile
 
#末尾增加以下内容
LD_LIBRARY_PATH
LD_LIBRARY_PATH
 
#保存退出,运行以下命令立即生效配置
profile

下载libjpeg、libpng、freetype链接如失效可访问:http://www.filewatcher.com/m/libjpeg-6b.tar.gz.961981-0.html

2、用法

原始图片是input.jpg,尺寸:160×120

1)只缩小不放大

 
1
jpg

加了>,表示只有当图片的宽与高,大于给定的宽与高时,才进行“缩小”操作。
生成的图片大小是:160×120,未进行操作
如果不加>,会导致图片被比等放大。

2)等比缩图 (缺点:产生白边)

 
1
jpg

生成的图片大小是:100×75

3)非等比缩图,按给定的参数缩图(缺点:长宽比会变化)

 
1
jpg

生成的图片大小是:100×100

4)裁剪后保证等比缩图 (缺点:裁剪了图片的一部分)

 
1
jpg

生成的图片大小是:100×100,还保证了比例。不过图片经过了裁剪,剪了图片左右两边才达到1:1

5)填充后保证等比缩图 (缺点:要填充颜色,和第一种方法基本一样)

 
1
jpg

生成的图片大小是:100×100,还保证了比例,同时没有对图片进行任何裁剪,缺失的部分按指定颜色进行填充。

6)裁剪、填充相结合 (缺点:最差的方法)

 
1
jpg

生成的图片大小是:100×100,这次保证了大小和比例,其中的10000就是100×100的乘积,同时在填充和裁剪之间做了一个平衡。

7)位深度32 转为24
IE6,7,8不支持显示“位深度32”的图片,但IE9、火狐、谷歌浏览器就可以显示。
使用GM,把“位深度32”的图片转换为“位深度24”的图片
输入图片zzz.jpg就是“位深度32”的图片,输出图片 zzz_out.jpg就是“位深度24”的图片

 
1
jpg

转完后,图片的颜色会有轻微变化。

更多请参考:http://elf8848.iteye.com/blog/382528

五、相关配置及脚本
1、Nginx配置文件

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
;
 
;
 
# 日志级别调试时可设为notice,生产环境请设为error
;
 
events
{
;
;
}
 
http
{
;
        
{
;
;
;
                
#/thumbnail目录下的图片请求不经过缩略图模块
{
        
}
                
#对类似_100x100.gif/jpg/png/jpeg进行缩略图处理
#匹配文件名规则
#站点根目录
#图片目录
#缩略图存放目录
#如果缩略图文件存在,直接返回
;
{
;
}
#如果缩略图文件不存在,则应用缩略图模块处理
{
;
}
}
}
 
;
}

2、Lua脚本
/usr/local/openresty/nginx/lua/thumbnail.lua

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
-- nginx thumbnail module
-- last update : 2014/8/21
-- version     : 0.4.1
 
'config'
 
--[[
    uri               :链接地址,如/goods/0007/541/001_328x328.jpg
    ngx_img_root      :图片根目录
    ngx_thumbnail_root:缩略图根目录
    img_width         :缩略图宽度
    img_width         :缩略图高度
    img_size          :缩略图宽x高
    img_crop_type     :缩略图裁剪类型
    cur_uri_reg_model :缩略图uri正则规则
]]
uri
image_root
thumbnail_root
0
default_uri_reg
 
--[[
    日志函数
    log_level: 默认为ngx.NOTICE
    取值范围:ngx.STDERR , ngx.EMERG , ngx.ALERT , ngx.CRIT , ngx.ERR , ngx.WARN , ngx.NOTICE , ngx.INFO , ngx.DEBUG
    请配合nginx.conf中error_log的日志级别使用
]]
)
lua_log_level
then
)
end
end
 
--    匹配链接对应缩略图规则
)
1
        
do
]
]
]
)
then
img_height
do
then
)
else
)
end
cur_uri_reg            
then
1
true
then
2
            
then
3
true
then
4
true
then
5

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua中的控制结构发布时间:2022-07-22
下一篇:
lua如何构造类发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap