zimg图片服务器入门

1|0zimg简介

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

2|0zimg特性

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

3|0zimg存储架构

为了极致的性能表现,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用到,互不影响同时也不会浪费。

 

4|0zimg部署

4|1安装必要依赖库

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

4|2下载安装zimg

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

4|3安装存储组件(可选)

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

4|4修改配置文件

路径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

4|5启动zimg

cd bin ./zimg conf/zimg.lua

 

5|0图片操作

5|1上传文件

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

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

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

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

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

5|2访问图片

 

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')  

5|3删除图片

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

6|0 

7|0使用问题

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

__EOF__

本文作者yjry
本文链接https://www.cnblogs.com/yjry-th/p/17170825.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   yjry-th  阅读(918)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示