zimg图片服务器入门

zimg简介

zimg是一个轻量级、高性能的图像存储和处理系统。

zimg特性

  1. 通过HTTP协议上传、下载和处理图像;
  2. 支持图片数据分布式存储(beansDB、SSDB);
  3. 并发 I/O 的高性能和压缩图像。‎‎;
  4. ‎支持 lua 脚本以处理自定义压缩策略;‎
  5. ‎支持 memcach 和重新制定协议,将图像保存到分布式存储后端;
  6. ‎操作和维护各种配置选项。

zimg存储架构

为了极致的性能表现,zimg全部采用C语言开发,总体上分为三个层次,前端http处理层,中间图片处理层和后端的存储层。

为了避免数据库带来的性能瓶颈,zimg不引入结构化数据库,图片的查找全部采用哈希来解决。事实上图片服务器的设计,是一个在I/O与CPU运算之间的博弈过程,最好的策略当然是继续拆:CPU敏感的http和图片处理层部署于运算能力更强的机器上,内存敏感的cache层部署于内存更大的机器上,I/O敏感的物理存储层则放在配备SSD的机器上,但并不是所有人都能负担得起这么奢侈的配置。zimg折中成本和业务需求,目前只需要部署在一台服务器上。由于不同服务器硬件不同,I/O和CPU运算速度差异很大,很难一棒子定死。zimg所选择的思路是,尽量减少I/O,将压力放在CPU上,事实证明这样的思路基本没错,在硬盘性能很差的机器上效果更加明显;即使以后SSD全面普及,CPU的运算能力也会相应提升,总体来说zimg的方案也不会太失衡。

zimg的部署力求简单,最佳的方案是zimg和后端存储分开在不同的机器上,因为zimg涉及压图,属于计算密集型,存储层无论是beansdb还是SSDB,都属于I/O密集型,而且由于zimg可以启用memcached做缓存,正好也可以充分利用机器上的内存,而存储机上的内存会被beansdb和SSDB用到,互不影响同时也不会浪费。

 

zimg部署

安装必要依赖库

openssl

wget http://www.openssl.org/source/openssl-1.0.1i.tar.gz
tar zxvf openssl-1.0.1i.tar.gz
cd openssl-1.0.1i
./config shared --prefix=/usr/local --openssldir=/usr/ssl
make && make install

cmake

wget http://www.cmake.org/files/v3.0/cmake-3.0.1.tar.gz
tar xzvf cmake-3.0.1.tar.gz 
cd cmake-3.0.1
./bootstrap --prefix=/usr/local 
make && make install

 

 libevent

wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar zxvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr/local
make && make install

nasm

wget https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.gz --no-check-certificate
tar zxvf nasm-2.15.05.tar.gz
cd nasm-2.15.05
./configure
make && make install

libjpeg-turbo

wget https://downloads.sourceforge.net/project/libjpeg-turbo/1.3.1/libjpeg-turbo-1.3.1.tar.gz
tar zxvf libjpeg-turbo-1.3.1.tar.gz
cd libjpeg-turbo-1.3.1
./configure --prefix=/usr/local --with-jpeg8
make && make install

webp

wget http://downloads.webmproject.org/releases/webp/libwebp-0.4.1.tar.gz
tar zxvf libwebp-0.4.1.tar.gz
cd libwebp-0.4.1
./configure
make
sudo make install

imagemagick

wget http://www.imagemagick.org/download/ImageMagick.tar.gz
tar zxvf ImageMagick.tar.gz
cd ImageMagick-6.9.1-10
./configure  --prefix=/usr/local 
make && make install 

libmemcached

wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar zxvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure -prefix=/usr/local 
make && make install

下载安装zimg

git clone https://github.com/buaazp/zimg -b master --depth=1
cd zimg   
make 

安装存储组件(可选)

memcached

wget http://www.memcached.org/files/memcached-1.4.19.tar.gz
tar zxvf memcached-1.4.19.tar.gzcd memcached-1.4.19
./configure --prefix=/usr/local
make
make install

beansdb

git clone https://github.com/douban/beansdbcd beansdb
./configure --prefix=/usr/local
make

beenseye

git clone git@github.com:douban/beanseye.gitcd beanseye
make

SSDB

wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip
unzip mastercd ssdb-master
make

twemproxy

git clone git@github.com:twitter/twemproxy.gitcd twemproxy
autoreconf -fvi
./configure --enable-debug=log
make
src/nutcracker -h

修改配置文件

路径zimg/bin/conf/zimg.lua
--zimg server config

--server config
--是否后台运行
is_daemon       = 1
--绑定IP
ip              = '0.0.0.0'
--端口
port            = 4869
--运行线程数,默认值为服务器CPU数
--thread_num=4
backlog_num     = 1024
max_keepalives  = 1
retry           = 3
system          = io.popen('uname -sn'):read('*l')
pwd             = io.popen('pwd'):read('*l')

--header config
--返回时所带的HTTP header
headers         = 'Cache-Control:max-age=7776000'
--是否启用etag缓存
etag            = 1

--access config
--support mask rules like 'allow 10.1.121.138/24'
--NOTE: remove rule can improve performance
--上传接口的IP控制权限,将权限规则注释掉可以提升服务器处理能力,下同
--upload_rule   = 'allow all'
--下载接口的IP控制权限
--download_rule = 'allow all'
--管理接口的IP控制权限
admin_rule      = 'allow 127.0.0.1'

--cache config
--是否启用memcached缓存
cache           = 1
--缓存服务器IP
mc_ip           = '127.0.0.1'
--缓存服务器端口
mc_port         = 11211

--log config
--log_level output specified level of log to logfile
--[[
LOG_FATAL 0     System is unusable
LOG_ALERT 1     Action must be taken immediately
LOG_CRIT 2      Critical conditions
LOG_ERROR 3     Error conditions
LOG_WARNING 4   Warning conditions
LOG_NOTICE 5    Normal, but significant
LOG_INFO 6      Information
LOG_DEBUG 7     DEBUG message
]]
--输出log级别
log_level       = 6
--输出log路径
log_name        = pwd .. '/log/zimg.log'

--htdoc config
--默认主页html文件路径
root_path       = pwd .. '/www/index.html'
--admin页面html文件路径
admin_path      = pwd .. '/www/admin.html'

--image process config
--禁用URL图片处理
disable_args    = 0
--禁用lua脚本图片处理
disable_type    = 0
--lua process script
--lua脚本文件路径
script_name     = pwd .. '/script/process.lua'
--format value: 'none' for original or other format names
--默认保存新图的格式,字符串'none'表示以原有格式保存,或者是期望使用的格式名
format          = 'jpeg'
--quality value: 1~100(default: 75)
--默认保存新图的质量
quality         = 75

--storage config
--zimg support 3 ways for storage images
--存储后端类型,1为本地存储,2为memcached协议后端如beansdb,3为redis协议后端如SSDB
mode            = 1
--save_new value: 0.don't save any 1.save all 2.only save types in lua script
--新文件是否存储,0为不存储,1为全都存储,2为只存储lua脚本产生的新图
save_new        = 1
--上传图片大小限制,默认100MB
max_size        = 100*1024*1024
--允许上传图片类型列表
allowed_type    = {'jpeg', 'jpg', 'png', 'gif', 'webp'}

--mode[1]: local disk mode
--本地存储时的存储路径
img_path        = pwd .. '/img'

--mode[2]: beansdb mode
--beansdb服务器IP
beansdb_ip      = '127.0.0.1'
--beansdb服务器端口
beansdb_port    = 7900

--mode[3]: ssdb mode
--SSDB服务器IP
ssdb_ip         = '127.0.0.1'
--SSDB服务器端口
ssdb_port       = 8888

启动zimg

cd bin  
./zimg conf/zimg.lua

 

图片操作

上传文件

form表单形式(返回html数据)

地址栏输入ip:4869,可访问zimg内置的简化图片上传页面,选择图片上传后(可批量上传),返回上传成功的页面;

raw-post形式(返回json数据)

使用代码上传文件,返回json响应数据,其中包含文件对应的唯一md5编码值,访问图片的形式不变。

注:上传相同文件,不会生成新的存储数据!

访问图片

 

http://ip:port/图片md5编码

访问图片时,不带任何参数,则zimg默认返回原图质量75%的图片。

可附带几个参数,对图片进行一些简单的处理工作,可用的参数列表如下:

参数名称 参数含义 备注
w 图片宽度

只限定长或者宽其中一项,会隐式附带缩放参数p=1,图片会被等比例缩放;若二者都设置,则会按照设置的宽高返回图片数据

h 图片高度
g 是否去除图片颜色

g=1代表去除颜色,返回黑白图片

x 锚点横坐标  
y 锚点纵坐标  
r 旋转角度(顺时针方向)  
p 缩放级别

p=0,代表查看原图;

p=1,代表等比例缩放

p=2,代表不缩放

p=3,代表按比例缩放(比例为wh设置)

q 图片质量(0=100) 数值越高,则图片质量越高
f 返回指定图片格式('jpeg', 'jpg', 'png', 'gif', 'webp')  

删除图片

调用http://ip:port/admin接口,传入参数md5t=1即可。

 

使用问题

  1. zimg项目在github上最后的提交时间为20171018日,此后项目没有任何的更新和维护,若我们在使用zimg的过程中出现问题,则可能很难去解决;
  2. 二次开发困难。zimg主要使用C语言开发,虽然代码开源,但是我们很难在此基础上扩展新功能;
  3. zimg的部署和运行需要安装大量依赖,实际部署时可能会出现依赖版本冲突情况,另外安装多个第三方依赖,对于服务器是否存在其他影响也是未知的;
  4. zimg服务的稳定性,有待实际投入后观察;
  5. 存入的图片信息有限,比如无采集时间、上传时间等字段。
posted @ 2023-03-02 10:24  yjry-th  阅读(853)  评论(0编辑  收藏  举报