zimg图片服务器入门
zimg简介
zimg是一个轻量级、高性能的图像存储和处理系统。
zimg特性
- 通过HTTP协议上传、下载和处理图像;
- 支持图片数据分布式存储(beansDB、SSDB);
- 并发 I/O 的高性能和压缩图像。;
- 支持 lua 脚本以处理自定义压缩策略;
- 支持 memcach 和重新制定协议,将图像保存到分布式存储后端;
- 操作和维护各种配置选项。
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,代表按比例缩放(比例为w、h设置) |
q | 图片质量(0=100) | 数值越高,则图片质量越高 |
f | 返回指定图片格式('jpeg', 'jpg', 'png', 'gif', 'webp') |
删除图片
调用http://ip:port/admin接口,传入参数md5、t=1即可。
使用问题
- zimg项目在github上最后的提交时间为2017年10月18日,此后项目没有任何的更新和维护,若我们在使用zimg的过程中出现问题,则可能很难去解决;
- 二次开发困难。zimg主要使用C语言开发,虽然代码开源,但是我们很难在此基础上扩展新功能;
- zimg的部署和运行需要安装大量依赖,实际部署时可能会出现依赖版本冲突情况,另外安装多个第三方依赖,对于服务器是否存在其他影响也是未知的;
- zimg服务的稳定性,有待实际投入后观察;
- 存入的图片信息有限,比如无采集时间、上传时间等字段。