通过tfs-nginx进行图片压缩过程

TFS是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器

集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用

在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化了文件的访问流程,一定程度上为TFS提供了良好的读写性能。

NameServer主要功能是:
管理维护Block和DataServer相关信息,包括DataServer加入,退出, 心跳信息,
block和DataServer的对应关系建立,解除。正常情况下,一个块会在DataServer上存在,
主NameServer负责Block的创建,删除,复制,均衡,整理,
NameServer不负责实际数据的读写,实际数据的读写由DataServer完成。

DataServer主要功能是: 负责实际数据的存储和读写。

原理:https://my.oschina.net/zimingforever/blog/174879

当客户端要上传一个图片,通过nameserver将图片写入dataserver中,在nameserver中保留文件的名字;当客户端需要下载图片时,通过访问tfs-nginx去nameserver中找到该图片,然后再去dataserver中下载。

在三台虚拟机上分别安装tfs-ns、tfs-ds、tfs-nginx

在nameserver,dataserver,nginx三部分都安装好后,来研究一下将图片进行压缩的代码过程,下面是项目真实环境,可以直接访问图片并压缩到对应的大小格式

在tfs-nginx安装了lua模块,在tfs-nginx中添加配置文件lua.conf。在主配置文件中加载lua.conf

下面是lua.conf文件中的一部分内容,编写了将图片压缩的过程

#$filePath /Disk/tfsimage/xxxxxxxx.jpg.20x20.jpg
#$reqPath /xxxxxxxx.jpg.20x20.jpg
#$filename xxxxxxxx.jpg
#$file /Disk/tfsimage/xxxxxxxx.jpg.20x20.jpg
#$fileone  /Disk/tfsimage/xxxxxxxx.jpg
#定义变量
set $image_root /Disk/tfsimage;
#这则匹配是否是我们要的格式
if ($uri ~* "/images/([0-9a-zA-Z_!]+).(([^.]+).*)") {
set $filePath "$image_root/$1.$2";
set $reqPath  "/$1.$2";
set $filename "$1.$3";
}
set $file "$image_root$reqPath";
set $fileone "$image_root/$filename";
#lua语法入口
rewrite_by_lua ‘
#定义方法file_exists
function file_exists(name)
#以只读模式打开一个文件
local f=io.open(name,"r")
# 打开的文件是否不等于空,如果不等于空证明之前有这个文件,关闭文件并返回真;如果等于空则返回假;
if f~=nil then io.close(f) return true else return false end
end ;
#定义方法tfsfile
function  tfsfile(name)
# 把叹号替换成点,并把替换后的字符串复制给res
local res =string.gsub(name,"!",".");
#返回res
return res;
end;
# 首先更改图片名字中的叹号,在判断图片是否存在,如果存在就重定向到innerImages
if file_exists(tfsfile(ngx.var.file)) then  ngx.req.set_uri("/innerImages" .. tfsfile(ngx.var.reqPath), true);
else
# 如果不存在,则判断源文件在不在,如果在打印111
if file_exists(tfsfile(ngx.var.fileone)) then print("111") else
# 如果不在,首先把图片名字中的叹号替换,然后把图片名字赋值给resfile
local resfile = tfsfile(ngx.var.filename);
# 定义命令command,下载需要的图片
command = string.format("wget -P /Disk/tfsimage/ http://192.168.1.244:8080/v1/tfs/"..resfile)
# 执行刚才定义的command命令
os.execute(command)
#定义命令commandt,给下载的图片打水印(/Disk/jinlejia.png 水印图;/Disk/tfsimage/原图;/Disk/tfsimage/打水印后的图)
commandt = "gm composite -gravity center -dissolve 70 /Disk/jinlejia.png /Disk/tfsimage/".. ngx.var.filename ..  " /Disk/tfsimage/"..ngx.var.filename;
#执行commandt命令
os.execute(commandt)
end;
#定义变量originalUri,area
local originalUri;
local area;
#将图片名中叹号替换,在filepath中找到20x20.jpg的索引位置,并赋值给index
local index = string.find(tfsfile(ngx.var.filePath), "([0-9]+)x([0-9]+)");
#如果index为空,则originalUri=叹号替换后的filePath
if index==nil then  originalUri = tfsfile(ngx.var.filePath);
else
#如果index存在,首先把图片名字中的叹号替换,将filepath从头截取到20x20.jpg的索引位置的前两位,也就是/Disk/tfsimage/xxxxxxxx.jpg,将值赋给originalUri
originalUri = string.sub(tfsfile(ngx.var.filePath), 0, index-2);
#首先把图片名字中的叹号替换,将filePath的20x20.jpg截取出来并赋给area
area = string.sub(tfsfile(ngx.var.filePath), index);
#在area中,也就是20x20.jpg中找到“.”的索引位置,将索引位置赋值给index
index = string.find(area, "([.])");
#将area截取到“.”的前一位,就是20x20,并赋值给新的area
area = string.sub(area, 0, index-1);
end
#定义变量image_sizes,存放图片的规格
local image_sizes={"100x66","105x70","1200x125","1200x260","1200x320","130x45","140x165","185x123","190x126","200x133","205x135","210x140","214x142","220x146","220x180","290x193","395x90","400x340","595x130","60x60","600x320","650x240","912x95","105x90","130x130","360x200","200x200","370x246","600x600","250x200","600x400","670x420","100x100","160x160","80x80","200x150","80x45","138x84","820x425","290x204","810x497","90x90","260x160","290x178","450x280","380x240","596x276","292x346","292x178","292x345","294x346","294x182","294x272","290x276","320x180","620x382","120x40","300x180","80x50","360x194","550x337","800x600"};
#定义方法,如果得到的area与image_sizes中的某个大小匹配的话,返回真
function table.contains(table, element)
#将table中的值进行循环,挨个与element匹配
for _, value in pairs(table) do
#如果匹配上则返回真,否则返回假
if value == element then
return true
end
end
return false
end
#如果area与image_sizes中的某个大小匹配的话
if table.contains(image_sizes, area) then
# 定义命令command ,将原图压缩成对应的大小 
local command = "gm convert " ..  originalUri  .. " -thumbnail " .. area .. " -background white -gravity center -extent " .. area .. " " .. tfsfile(ngx.var.file);
# 执行刚才定义的command命令
os.execute(command);
#如果图片没有压缩,执行上面的一系列压缩过程,然后重定向
ngx.req.set_uri("/innerImages" .. tfsfile(ngx.var.reqPath), true);
else
#如果能够找到压缩过的图片,直接重定向
ngx.req.set_uri("/innerImages" .. tfsfile(ngx.var.reqPath), true);
end;
end
‘;
}

浏览器访问路径为tfs-nginxIP地址/image/图片名.jpg

若要访问压缩的图片,访问tfs-nginxIP地址/image/图片名.jpg.800x600.jpg即可

时间: 2024-10-14 00:15:50

通过tfs-nginx进行图片压缩过程的相关文章

vsftpd+nginx搭建图片服务器的一些问题

前言 五月份做了一个项目,其中有一个vsftpd+nginx搭建图片服务器的部分,一直出现错误,在控制台上显示上传成功,可是访问相关图片页面却一直访问不了,想了几天也没解决,于是这个bug就一直放在那,直到今天才解决. 一.安装vsftpd+nginx 这里网上都是资料,不多阐述 二.vsftpd遇到的错误    1.启动systemctl start vsftpd 发生错误: 解决方法 1)按照网上说的,把vsftpd.conf配置文件下的#listen_ipv6=YES注释掉或者改为NO 2

nginx搭建图片服务器

http_image_filter_module是nginx提供的集成图片处理模块,支持nginx-0.7.54以后的版本,在网站访问量不是很高磁盘有限不想生成多余的图片文件的前提下可,就可以用它实时缩放图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息,由于是即时计算的结果,所以网站访问量大的话,不建议使用. 安装nginx wget http://nginx.org/download/nginx-1.7.3.tar.gz 安装gd yum install gd-devel 安装p

防盗链Nginx设置图片防盗链,设置无效的请仔细看红字

*******************************************************************切记,替换的图片地址要使用没有防盗链的网站图片,否则由于替换的图片其实也处于防盗链情况下,会造成仍旧无法显示设置的图片.******************************************************************* 一.全站图片防盗链 在/usr/local/nginx/conf/nginx.conf文件要添加防盗链的ser

nginx关闭图片,js,css等的日志

一般来说这些日志的分析价值不高,而且还占用硬盘空间,一般都会关掉. nginx配置: location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ {                        access_log off;                        proxy_pass              http://cdel_jxjy;                        proxy_redirect          off;   

nginx配置图片服务器

这几天研究了一下nginx配置图片服务器的相关内容,个人的一些收获与大家分享一下: Nginx是目前非常流行的web服务器,它起源于俄罗斯.它具有处理速度快,并发量大,占用资源极低等优点,尤其对于静态资源的处理更佳,有测试证明是apache的30倍.现在已经广泛的应用于多家门户网站.中大型网站中,作为反向代理.图片缓存服务器等.本例是结合张宴的blog(http://blog.s135.com/nginx_cache/),做的变动.主站是IIS7.5(192.168.36.70),用的是.net

Nginx实现图片回显

在全国项目峰会的时候,自己的项目因为上传的图片没回显还在纳闷怎么弄..... 现在知道了用Nginx反向代理就能够完成此功能. (一) 反向代理机制 业务需求: 用户上传的图片和用户请求图片的网址有差别. 磁盘路径: E:\zhangchaocai\2018\11\02\abc.jpg 虚拟路径: http://image.jt.com\2018\11\02\abc.jpg 如何将虚拟路径地址正确的映射到磁盘路径中??? (二) 反向代理说明 找到一个好用的画图软件,简单易用才是王道.FastS

nginx服务器图片防盗链的方法

nginx服务器图片防盗链的方法<pre> location ~* \.(gif|jpg|png|jpeg)$ { expires 30d; valid_referers *.shuchengxian.com www.shuchengxian.com; if ($invalid_referer) { rewrite ^/ http://www.shuchengxian.cn/404.jpg; } }</pre>代码解释: <pre>//其中“gif|jpg|jpeg|p

nginx代理图片上传以及访问

nginx代理图片上传 首先需要利用nginx代理图片访问参考 https://www.cnblogs.com/TJ21/p/12609017.html 编写接受文件的controller 1 @PostMapping("image") 2 public ResponseEntity<String> uploadImage(MultipartFile file){ 3 4 String url = null; 5 try { 6 url = uploadService.up

nginx代理图片访问

nginx代理图片访问 首先配置nginx的代理物理路径 我的是在E盘下面的image 1 #图片的代理 2 server { 3 listen 80; 4 #配置访问的域名 5 server_name image.leyou.com; 6 7 #charset koi8-r; 8 9 #access_log logs/host.access.log main; 10 11 location / { 12 #配置代理的物理路径 13 root E:\\image; 14 15 } 16 } 在本