轻量级分布式文件系统FastDFS——实现用户头像上传/压缩屏幕适配


一、需求分析

1.1 业务场景:

用户上传的头像图片大小不一、手机和PC等设备显示尺寸也存在差异,因此需要能根据http请求指定的尺寸参数对图片进行动态压缩,以达到屏幕适配的作用。

1.2 功能需求:

搭建FastDFS图片服务器,通过http请求访问服务器中图片时,显示动态缩略图。

具体要求如下

  • 1.在Linux系统中安装FastDFS服务器
  • 2.可以使用FastDFS自带的工具将文件上传到FastDFS
  • 3.通过http访问某个图片时,FastDFS通过GraphicsMagick工具生成缩略图,将动态缩略图响应输出

1.3 实现思路:

 1.GraphicsMagick,安装完成之后测试是否支持png、jpg,以及验证gm是否可用2.安装LuaJIT、lua-nginx-module和ngx_devel_kit3.安装Nginx,安装完成后测试lua环境是否支持,比如输出hello world4.在Nginx中配置lua脚本,在lua脚本中使用gm命令完成图片压缩

二、环境版本介绍

2.1 软件版本

环境&软件 版本
虚拟机&VMware Workstation 15 Pro
服务器&CentOS CentOS-7-x86_64-DVD-1810.iso
GraphicsMagick 1.3.21
LuaJIT 2.0.4
lua-nginx-module 0.8.10
GraphicsMagick 1.3.18
ngx_devel_kit 0.2.18
Nginx 1.15.6
LuaJIT 2.0.2
远程文件传输&WinSCP、Xftp 5
远程连接&Xshell 5

2.2 软件下载地址:

  • 操作系统:centos7下载地址 提取码:5555
  • MySQL数据库:mysql5.7下载地址 提取码:5555
  • Xshell:xshell5下载地址 提取码:5555

三、环境搭建——FastDFS 安装

具体安装步骤可以参考:github FastDFS安装参考

3.1 安装编译环境

保证目前主机可以上网状态:

安装必要的编译环境:yum install git gcc gcc-c++ make automake vim wget libevent -y

3.2 安装libfastcommon 基础库

mkdir /usr/local/fastdfs
cd /usr/local/fastdfs
git clone https://github.com/happyfish100/libfastcommon.git --depth 1
cd libfastcommon/
./make.sh && ./make.sh install

下载libfastcommon 基础库:

编译并安装libfastcommon 基础库:

3.3 安装FastDFS

在FastDFS目录中下载FastDFS:

 cd   /usr/local/fastdfswget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz


解压缩安装包:

 tar -zxvf V5.11.tar.gz

进入fastdfs目录并安装:

cd fastdfs-5.11
./make.sh && ./make.sh install

查看在etc目录下生成的配置文件

参考系统提供的配置文件,生成fastdfs配置文件:

 cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.confcp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.confcp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf

拷贝fastdfs目录下的配置文件到/etc/fdfs目录中

cp /usr/local/fastdfs/fastdfs-5.11/conf/http.conf /etc/fdfs
cp /usr/local/fastdfs/fastdfs-5.11/conf/mime.types /etc/fdfs
vim /etc/fdfs/tracker.conf

修改配置文件:tracker.conf

port=22122  访问端口
base_path=/home/fastdfs   数据存储路径

修改配置文件:tracker.conf

vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000
base_path=/home/fastdfs # 数据和日志文件存储根目录
store_path0=/home/fastdfs # 第一个存储目录
tracker_server=192.168.80.222:22122    修改成自己的主机端口
#http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
http.server_port=8888

3.4 启动

mkdir /home/fastdfs -p       创建数据存储目录
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart    启动追踪器
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart    启动存储器
netstat -ntlp   查看所有运行的端口


3.5 测试上传(使用fdfs提供的客户端)

vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/home/fastdfs
#tracker服务器IP和端口
tracker_server=192.168.80.222:22122

#保存后测试,返回ID表示成功 如:group1/M00/00/00/xxx.png执行上传命令:/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/fastdfs/1.png存储路径:group1/M00/00/00/wKhQ3l9xVwCAFk-SAABmHOi0QSA283.jpg

3.6 下载借助nginx来实现(安装fastdfs-nginx-module)


下载:

cd /usr/local/fastdfs/
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz

解压

tar -xvf V1.20.tar.gz
cd fastdfs-nginx-module-1.20/src

修改配置文件:config

vim config
修改第6 行 和 15 行 修改成
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

拷贝并修改配置文件:

cp mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf

需要修改的内容如下:

tracker_server=192.168.211.136:22122    追踪服务器地址
url_have_group_name=true   上面上传文件时是带着组名称的,因此这里设置成true
store_path0=/home/fastdfs

3.7 安装nginx(将磁盘路径变为http可以访问的路径)

nginx启动默认需要的目录,下载并解压nginx:

mkdir -p /var/temp/nginx/client   cd  /usr/local/fastdfs/
wget http://nginx.org/download/nginx-1.15.6.tar.gz
tar -zxvf nginx-1.15.6.tar.gz

安装nginx需要的依赖库:

cd nginx-1.15.6/
yum -y install pcre-devel openssl openssl-devel

添加fastdfs-nginx-module模块,使nginx和nginx-module进行关联:

./configure --add-module=/usr/local/fastdfs/fastdfs-nginx-module-1.20/src

编译安装

make && make install

查看模块是否安装上

/usr/local/nginx/sbin/nginx -V

vim /usr/local/nginx/conf/nginx.conf

#添加如下配置
server {listen    8888;server_name localhost;location ~/group[0-9]/ {       # 匹配请求带有group组名的请求ngx_fastdfs_module;}
}

启动nginx

/usr/local/nginx/sbin/nginx

3.8 测试下载

关闭防火墙

systemctl stop firewalld

通过http下载图片

http://192.168.80.222:8888/group1/M00/00/00/wKhQ3l9xVwCAFk-SAABmHOi0QSA283.jpg

四、环境搭建——GraphicsMagick安装

下载:LuaJIT-2.0.2.tar.gz 提取码:x5ha
下载:v0.8.6.tar 提取码:8odz
下载:ngx_devel_kit-0.2.18.tar 提取码:9ey5
下载:nginx-1.4.2.tar 提取码:r7ia

4.1 Nginx-Lua-FastDFS-GraphicsMagick

我们通常使用FastDFS来当作图片服务器,客户端通过Nginx请求图片。某些情况下,客户端对请求的图片有尺寸要求:

 如 http://ip:port/group1/M00/00/00/asdasd42342ascascasc.jpg_100x200.jpg

这时我们可以使用GraphicsMagick工具动态的修改图片以满足客户端的需求。
这里使用lua脚本调用GraphicsMagick的gm命令动态处理图片。

4.2 整体思路:

  • 1、首先服务器需要有lua环境
  • 2、Nginx扩展支持lua,可调用lua脚本
  • 3、lua脚本中定义gm命令及参数

4.3 下载安装lua环境

下载LuaJIT:

 tar  -zxvf LuaJIT-2.0.2.tar.gz


安装LuaJIT:

 cd LuaJIT-2.0.2make && make install

4.4 配置lua环境变量

 export LUAJIT_LIB=/usr/local/libexport LUAJIT_INC=/usr/local/include/luajit-2.0

4.5 预先安装png,jpeg支持包

4.6 安装GraphicsMagick

 wget http://ftp.icm.edu.pl/pub/unix/graphics/GraphicsMagick/1.3/GraphicsMagick-1.3.21.tar.gz

 tar -zxvf GraphicsMagick-1.3.21.tar.gz

 ./configure --prefix=/data/local/GraphicsMagick --enable-shared

 make && make install

查看GraphicsMagick 支持的文件类型:

 若PNG、JPEG等不支持,可以在编译GraphicsMagick的时候,使用 --with-png=yes/data/local/GraphicsMagick/bin/gm -version

4.7 准备模块包

 tar zxvf ngx_devel_kit-0.2.18.tar.gztar zxvf v0.8.6.tar.gz

4.8 nginx安装模块包(注意:版本兼容问题)

删除原来的nginx1.15.6版本,版本不兼容

 rm -rf /usr/local/nginx/ rm -rf /var/temp/nginx/

解压缩新的nginx1.4.2

 tar -zxvf nginx-1.4.2.tar.gz    (注意:重新安装nginx1.4.2)


添加模块:

 ./configure --add-module=/usr/local/fastdfs/lua-nginx-module-0.8.6 --add-module=/usr/local/fastdfs/ngx_devel_kit-0.2.18 --add-module=/usr/local/fastdfs/fastdfs-nginx-module-1.20/src

安装:

 make && make install

4.9 测试nginx扩展lua是否正常:

修改nginx配置文件

 vim /usr/local/nginx/conf/nginx.conf
location /test {default_type text/html;content_by_lua 'ngx.say("hello dabing")ngx.log(ngx.ERR,"err err")';
}


如果启动nginx,报错

 /usr/local/nginx/sbin/nginx报错:/usr/local/nginx/sbin/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

解决:

 find / -name libluajit-5.1.so.2ln -s /usr/local/lib/libluajit-5.1.so.2 /usr/lib64/libluajit-5.1.so.2

再次启动nginx,并测试nginx扩展lua是否正常:若返回hello dabing即说明正常

 /usr/local/nginx/sbin/nginx

4.10 上传lua脚本:lua脚本ImageResizer.lua

链接:lua脚本ImageResizer.lua 提取码:rwti

查看上传的lua脚本:ImageResizer.lua

4.11 修改nginx配置:vim /usr/local/nginx/conf/nginx.conf

配置两个server并重新设置端口 8888和80

8888端口:访问正常大小的图片
80端口:访问缩略图,使用lua脚本调用GraphicsMagick的gm命令动态处理图片

#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';#access_log  logs/access.log  main;sendfile        on;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;#gzip  on;server {listen 8888;server_name localhost;location ~/group[0-9]/ {ngx_fastdfs_module;}}
#-------------------------------------------------------------------------------------server {listen       80;server_name  localhost;location /test {default_type text/html;content_by_lua 'ngx.say("hello dabing")ngx.log(ngx.ERR,"err err")';}  location /group1/M00 {alias /home/fastdfs/data;if ($uri ~* ^/group1/M00(.+\.(jpg|jpeg|gif|png))_(\d+)x(\d+)\.(jpg|jpeg|gif|png)) {       add_header X-Powered-By 'Lua GraphicsMagick';add_header file-path $request_filename;lua_code_cache on;set $request_filepath /home/fastdfs/data$1;set $width $3;set $height $4;set $ext $5;}if (!-f $request_filename) {content_by_lua_file conf/lua/ImageResizer.lua;}}location / {root   html;index  index.html index.htm;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}# HTTPS server##server {#    listen       443;#    server_name  localhost;#    ssl                  on;#    ssl_certificate      cert.pem;#    ssl_certificate_key  cert.key;#    ssl_session_timeout  5m;#    ssl_protocols  SSLv2 SSLv3 TLSv1;#    ssl_ciphers  HIGH:!aNULL:!MD5;#    ssl_prefer_server_ciphers   on;#    location / {#        root   html;#        index  index.html index.htm;#    }#}}

压缩请求的核心配置:用户请求80端口时,并且携带图片压缩尺寸,则使用lua脚本调用GraphicsMagick的gm命令动态处理图片

设置/home/fastdfs/data目录的访问权限:

在nginx的/usr/local/nginx/conf目录下创建lua目录:上图配置文件的配置相对应

将lua脚本ImageResizer.lua 复制到lua目录中:

4.12 缩略图测试

/usr/local/nginx/sbin/nginx              启动nginx
mkdir  /home/fastdfs -p                     创建数据存储目录
/usr/bin/fdfs_trackerd   /etc/fdfs/tracker.conf restart              启动追踪器
/usr/bin/fdfs_storaged   /etc/fdfs/storage.conf restart          启动存储器
netstat   -ntlp             查看所有运行的端口执行上传命令:/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/ceshi.png
存储路径:group1/M00/00/00/wKhQ3l9xyOOAGtSnAANcn_hj_QM889.png

访问正常大小的图片:

访问缩小的图片:100×100

访问缩小的图片:900×900

实战:轻量级分布式文件系统FastDFS(GraphicsMagick图片压缩)相关推荐

  1. 轻量级分布式文件系统FastDFS使用安装说明手册(新手入门级)

    轻量级分布式文件系统FastDFS使用安装说明手册(新手入门级) 实验室所在的课题组以研究云计算为主,但所有的研究都是在基于理论的凭空想像,缺少分布式环境的平台的实践,云计算神马的都是浮云了.因此,我 ...

  2. Linux中安装FastDFS轻量级分布式文件系统

    先来介绍一下什么是FastDFS FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特 ...

  3. 分布式文件系统FastDFS架构剖析

    文/余庆 FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux.FreeBSD.AIX等UNIX系统.它只能通过专有API对文件进行存取访问,不支持POSIX ...

  4. (转)淘淘商城系列——分布式文件系统FastDFS

    http://blog.csdn.net/yerenyuan_pku/article/details/72801777 商品添加的实现,包括商品的类目选择,即商品属于哪个分类?还包括图片上传,对于图片 ...

  5. fastdfs原理_搭建分布式文件系统FastDFS集群

    本文摘选abcdocker运维博客 abcdocker运维博客 – 专注DevOps自动化运维,传播优秀it运维技术文章​i4t.com 在生产环境中往往数据存储量比较大,因此会大部分会选择分布式存储 ...

  6. 网站文件系统发展分布式文件系统fastDFS

    网站文件系统发展 1.单机时代的图片服务器架构 初创时期由于时间紧迫,开发人员水平也很有限等原因.所以通常就直接在website文件所在的目录下,建立1个upload子目录,用于保存用户上传的图片文件 ...

  7. 分布式文件系统FastDFS详解-附带视频教程

    目录 1.FastDFS教程 2.FastDFS安装 安装FastDFS FastDFS配置文件详解 FastDFS启动 3.FastDFS重启与FastDFS关闭 FastDFS关闭 4.FastD ...

  8. 分布式文件系统FastDFS的搭建

    FastDFS分布式文件系统说明 FastDFS 是以C语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载),特别适合以文件为载体的在线 ...

  9. 分布式文件系统----FastDFS

    FastDFS 1.分布式文件系统 1.1 FastDFS简介 1.2 FastDFS整体架构 1.3 FastDFS的存储策略 1.4 FastDFS的上传过程 1.5 FastDFS的文件同步 1 ...

最新文章

  1. Android采用Application总结一下
  2. swift_004(Storyboard进行界面跳转及传值)
  3. Xamarin图表开发基础教程(6)OxyPlot框架
  4. c printf 缓冲区分析
  5. Spring DI依赖注入讲解
  6. android 面试题(一)
  7. android 短信注册,Android注冊短信验证码功能
  8. python send 案例_python使用rabbitmq实例三,交换机
  9. 年度总结 是不公平和智障的产物
  10. sqoop-import 并行抽数及数据倾斜解决
  11. 容灾服务器作用,存储容灾服务
  12. db2字符串定位_DB2/Oracle/SQL server判断某个字符串或单个字符在源字符串中出现的位置...
  13. DevOps 小组运维管理手册
  14. 【linux浅谈017】gbd调试常用指令
  15. 网赚渠道,付费项目和免费项目,你会选择哪种网赚方式
  16. [译]OOSE第7章:Analysis 分析 7.3 The analysis model 分析模型 7.4 Summary
  17. 苹果iPhone5 16G长沙九方现货售8199元
  18. 使用LDAP Directory的好处
  19. 帕金《宏观经济学》第8版课后习题答案
  20. wine葡萄酒数据集KNNSVM分类实验

热门文章

  1. 如何快速处理线上故障【转】
  2. Android编译期代码生成之apt实践入门
  3. Android访问数据库(SQL Server 和 MySQL)
  4. LayerDrawable层叠样式layer
  5. IDC分析报告:亚洲安全软件市场兴旺
  6. C#中的异步调用剖析
  7. HDU 4547 CD操作
  8. 初识 ::after
  9. 获取某数据库中含有某字段的所有表的脚本
  10. 【转载】Java 内存分配全面浅析