FastDFS单节点部署
- 1、FastDFS入门
- 1.1 分布式文件系统
- 1.2 FastDFS 简介
- 1.3 FastDFS 发展历史
- 1.4 FastDFS 整体架构
- 1.5 FastDFS 线上使用者
- 2、FastDFS 环境搭建
- 2.1 FastDFS 安装
- 2.1.1 安装前的准备
- 2.1.2 安装 libfastcommon库
- 2.1.3 安装 FastDFS
- 2.2FastDFS 配置
- 2.2.1 去掉/etc/fdfs/目录下 FastDFS 配置文件的后缀名
- 2.2.2 修改 tracker.conf 文件
- 2.2.3 修改 storage.conf 文件
- 2.2.4 在 Linux 服务器上创建上面指定的目录
- 2.2.5 然后启动 FastDFS
- 2.3FastDFS 启动
- 2.3.1 启动 FastDFS 的 tracker 服务
- 2.3.2 启动 FastDFS 的 storage 服务
- 2.3.3 查看启动进程
- 2.3.4 查看 storage 是否已经注册到了 tracker 下
- 2.3.5 首次启动 storage 后,会在配置的路径下创建存储文件的目录
- 2.4FastDFS重启
- 2.4.1 重启 tracker
- 2.4.2 重启 storage
- 2.5 FastDFS 关闭
- 2.5.1 关闭 tracker 执行命令
- 2.5.2 关闭 storage 执行命令
- 2.5.3 kill 关闭 fastdfs
- 2.6 FastDFS 测试
- 2.6.1 测试之前,需要修改 client.conf 配置文件,修改两个配置
- 2.6.2 测试文件上传
- 2.6.3 FastDFS 生成的文件目录结构及名称示例
- 2.6.4 测试文件下载
- 2.6.5 测试文件删除
- 2.6.6 注意
- 3、分布式文件系统 FastDFS的 HTTP 访问
- 3.1 概述
- 3.2 前期准备工作
- 3.2.1 将 Fastdfs 的 Nginx 扩展模块源代码上传到 Linux 上
- 3.2.2 解压下载下来的 fastdfs-nginx-module-master.zip 文件
- 3.3安装 Nginx 并且添加 fastDFS 模块
- 3.3.1 将 Nginx 的 tar 包上传到 Linux 上
- 3.3.2 解压上传的 Nginx 文件
- 3.3.3 切换至解压后的 Nginx 主目录,执行配置操作
- 3.3.4 执行命令进行编译
- 3.3.5 执行命令进行安装
- 3.3.6 以上安装 Nginx 的 FastDFS 扩展模块注意事项
- 3.4FastDFS 的 Nginx 访问配置
- 3.4.1 拷贝mod_fastdfs.conf到/etc/fdfs/目录下
- 3.4.2 修改 mod_fastdfs.conf 配置文件
- 3.4.3 在/opt/fastdfs/目录下创建 nginx_mod 目录
- 3.4.4 配置 Nginx 的配置文件
- 3.5FastDFS 的 Nginx 访问启动与测试
- 3.5.1 启动带有 Fastdfs 模块的 Nginx
- 3.5.2 重启或启动 FastDFS 服务进程
- 3.5.3 上传一个文件进行测试验证
- 3.5.4 在浏览器访问上传的文件
- 3.5.5 扩展
- 3.5.6 FastDFS扩展模块执行流程
- 4、FastDFS 在 Java 项目中开发示例
- 4.1 在实际项目开发中,FastDFS 提供的主要功能
- 4.2 FastDFS 文件系统的 Java 客户端
- 4.2.1 下载官方的源代码
- 4.2.2 解压
- 4.2.3 采用 maven 命令编译成 jar 安装到本地 maven 库
- 4.2.4 在 Java 程序中使用它提供的 API 来访问 FastDFS 文件系统
- 4.3文件上传功能的实现
- 4.3.1 需求
- 4.3.2 实现步骤
1、FastDFS入门
1.1 分布式文件系统
分布式文件系统 (Distributed File System) 是一个软件/软件服务器,这个软件可以用来管理文件。但这个软件所管理的文件通常不是在一个服务器节点上,而是在多个服务器节点上,这些服务器节点通过网络相连构成一个庞大的文件存储服务器集群,这些服务器都用于存储文件资源,通过分布式文件系统来管理这些服务器上的文件。
常见的分布式文件系统有:FastDFS、GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS 等。其实均是类GFS的文件系统。
- 分布式文件系统与传统文件系统对比
- 传统方式弊端:
- 如果用户数量多,IO操作比较多,对磁盘访问压力很大
- 如果磁盘发生故障,会造成数据丢失
- 存储容量有限
FastDFS分布式文件系统的优点:
- 解决传统方式的单点故障问题,如果某一个节点出现故障,还有其他的节点可以用来读取和写入文件
- 可以提供数据备份避免因磁盘损坏导致的文件丢失
- 可以提供扩容的机制,无限增加文件存放的空间上限
FastDFS特点:
-
分组存储,简单灵活;
-
对等结构,不存在单点;
-
文件ID由FastDFS生成,作为文件访问凭证。FastDFS不需要传统的nameserver或metaserver;
-
大、中、小文件均可以很好支持,可以存储海量小文件;
-
一台storage支持多块磁盘,支持单盘数据恢复;
-
提供了nginx扩展模块,可以和nginx无缝衔接;
-
支持多线程方式上传和下载文件,支持断点续传;
-
存储服务器上可以保存文件附加属性。
1.2 FastDFS 简介
FastDFS 是一个开源的轻量级分布式文件系统,为互联网应用量身定做,简单、灵活、高效,采用 C 语言开发,由阿里巴巴开发并开源。
FastDFS 对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载、文件删除)等,解决了大容量文件存储的问题,特别适合以文件为载体的在线服务,如相册网站、文档网站、图片网站、视频网站等等。
FastDFS 充分考虑了冗余备份、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
1.3 FastDFS 发展历史
2008 年 4 月项目启动,7 月发布第一个版本 V1.00,两年时间内持续升级到 V1.29
2010 年 8 月推出 V2.00
2011 年 6 月推出 V3.00
2012 年 10 月推出 V4.0.0
2013 年 12 月推出 V5.0.0
截止目前最新版是 V5.11(2017 年 6 月发布)
FastDFS 系统架构从第一个版本发布后一直没有大的调整,高版本完全兼容低版本的数据,可以做到平滑升级,推荐更新升级到最新版本
FastDFS 代码托管在 github 上:https://github.com/happyfish100/fastdfs
1.4 FastDFS 整体架构
FastDFS 文件系统由两大部分构成,一个是客户端,一个是服务端。
客户端通常指我们的程序,比如我们的 Java 程序去连接 FastDFS、操作 FastDFS,那我们的 Java 程序就是一个客户端,FastDFS 提供专有 API 访问,目前提供了 C、Java 和 PHP 几种编程语言的 API,用来访问 FastDFS 文件系统。业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。
服务端由两个部分构成:一个是跟踪器(tracker),一个是存储节点(storage)
跟踪器(tracker)主要做调度工作,在内存中记录集群中存储节点storage的状态信息,是前端Client和后端存储节点storage的枢纽。因为相关信息全部在内存中,Tracker server的性能非常高,一个较大的集群(比如上百个 group)中有3台就足够了。
跟踪器,主要做调度工作,管理集群,在访问上起到负载均衡的作用。 `tracker`也可以实现集群。每个`tracker`节点地位平等。
作用:引导客户端去哪台服务器存储数据,实际上是客户端与存储服务器直接进行通信的,并不需要通过`Tracker`进行中转。
存储节点(storage)用于存储文件,包括文件和文件属性(meta data)都保存到存储服务器磁盘上,完成文件管理的所有功能:文件存储、文件同步和提供文件访问等。
存储节点,完成文件管理的所有功能:存储、同步和提供存取接口,FastDFS同时对文件的`metadata`进行管理。需要连接`tracker`端,定期报告自己的情况(是否活着,剩余容量,负载情况)分为多个组,每个组之间保存的文件是不同的。每个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念。
`Storage`是可以实现横向扩容的,向里面添加组服务器,且同一个组里面的文件是一样的,一台服务器挂了,还有别的服务器可以提供访问。(实现高可用)一台服务器很忙,可以将访问分配给其他服务器,实现负载均衡。
FastDFS上传文件交互过程
client
询问tracker
上传到的storage
,不需要附加参数;tracker
返回一台可用的storage
client
直接和storage
通讯完成文件上传
FastDFS下载文件交互过程
client
询问tracker
下载文件的storage
,参数为文件标识(卷名和文件名);tracker
返回一台可用的storage
;client
直接和storage
通讯完成文件下载
1.5 FastDFS 线上使用者
UC (http://www.uc.cn/ ,存储容量超过 10TB)
支付宝(http://www.alipay.com/)
京东商城(http://www.jd.com/)
淘淘搜(http://www.taotaosou.com/)
飞信(http://feixin.10086.cn/)
赶集网(http://www.ganji.com/)
淘米网(http://www.61.com/)
迅雷(http://www.xunlei.com/)
蚂蜂窝(http://www.mafengwo.cn/)
5173(http://www.5173.com/)
华师京城教育云平台(http://www.hsjdy.com.cn/)
视友网(http://www.cuctv.com/)
搜道网(http://www.sodao.com/)
58 同城(http://www.58.com/)
商务联盟网(http://www.biz72.com/)
中青网(http://www.youth.cn/)
保利威视(http://www.freeovp.com/)
梦芭莎(http://www.moonbasa.com/)
51CTO(http://www.51cto.com/)
搜房网(http://www.soufun.com/)
2、FastDFS 环境搭建
2.1 FastDFS 安装
2.1.1 安装前的准备
(1)检查 Linux 上是否安装了 gcc、libevent、libevent-devel
yum list installed | grep gcc
yum list installed | grep libevent
yum list installed | grep libevent-devel
(2) 如果没有安装,则需进行安装
yum install gcc libevent libevent-devel -y
2.1.2 安装 libfastcommon库
libfastcommon 库是 FastDFS 文件系统运行需要的公共 C 语言函数库
注意:目前最新版本的 v1.0.39 和最新版的 FastDFS5.11 不兼容,所有我们这里使用的版本是 v1.0.36 下载地址:https://github.com/happyfish100
(1) 将下载好的 libfastcommon 文件上传到 linux服务器(/soft)
(2) 解压下载下来的 tar.gz 压缩包到当前目录
tar -zxvf libfastcommon-1.0.36.tar.gz
(3) 切换到解压后的 libfastcommon 目录
cd libfastcommon-1.0.36
(4) 执行 make 脚本进行编译
./make.sh
注意: make 编译的时候如果报错,需解决错误后再次进行 make,通常发生错误是由于 Linux 缺少某些依赖库导致,根据错误提示解决错误
(5) 执行 make install 进行安装
./make.sh install
#安装完成提示libfastcommon安装在了如下两个位置
#/usr/lib/libfastcommon.so
#/usr/lib64/libfastcommon.so
#可分别进入这两个目录并查看
cd /usr/lib && ls | grep libfastcommon.so
cd /usr/lib64 && ls | grep libfastcommon.so
#由于FastDFS主程序设置的目录为/usr/local/lib/,所以我们需要创建/usr/lib64/下的一些核心执行程序的软连接文件,执行以下命令
# ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so \
# && ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so \
# && ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so \
# && ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
#如果是fastdfs5.0.8,上述创建软连接,可能会提示已经存在,但是为了保证没有漏掉,建议还是都执行一遍
至此 libfastcommon 库安装完毕
2.1.3 安装 FastDFS
FastDFS没有 Windows 版本,不能在Windows下使用。
FastDFS需要安装部署在Linux环境下,我们这里使用的是 fastdfs-5.11版本(201901)
下载地址: https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
(1) 将下载好的 FastDFS 文件上传到 Linux(home/soft)
(2) 解压下载下来的 tar.gz 压缩包到当前目录
tar -zxvf fastdfs-5.11.tar.gz
(3) 切换到解压后 FastDFS 的目录
cd fastdfs-5.11
(4) 执行 make 脚本进行编译
./make.sh
(5) 执行 make install 进行安装
./make.sh install
# 验证
cd /etc/fdfs && ll #查看配置文件列表
cd /etc/init.d && ll |grep fdfs #查看服务脚本
cd /usr/bin && ll |grep fdfs #查看执行脚本
# 全局替换执行脚本目录(5.0.8及以后的版本就不需要执行这一步了)
vim /etc/init.d/fdfs_storaged #编辑fdfs_storaged文件,执行全局替换
:%s+/usr/local/bin+/usr/bin #(键盘输入才有效)
vim /etc/init.d/fdfs_trackerd #编辑fdfs_trackerd文件,执行全局替换
:%s+/usr/local/bin+/usr/bin #(键盘输入才有效)
至此 FastDFS 安装完成
- 所有编译出来的文件存放在/usr/bin 目录下
- 所有配置文件存放在/etc/fdfs 目录下
(6) 查看安装后的效果
- 查看 FastDFS 相关的可执行程序
ll /usr/bin/fdfs*
- 查看 FastDFS 的配置文件
ll /etc/fdfs/
(7) 另外注意需要把解压后的 fastdfs-5.11/conf 目录下的两个文件拷贝到/etc/fdfs/ ,否则后续会有很多奇怪问题不好解决
cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/
这两个文件后续需要用到,所以先拷贝过去
2.2FastDFS 配置
2.2.1 去掉/etc/fdfs/目录下 FastDFS 配置文件的后缀名
[root@fastdfs01 fastdfs-5.11]# cd /etc/fdfs/
[root@fastdfs01 fdfs]# mv client.conf.sample client.conf
[root@fastdfs01 fdfs]# mv storage.conf.sample storage.conf
[root@fastdfs01 fdfs]# mv storage_ids.conf.sample storage_ids.conf
[root@fastdfs01 fdfs]# mv tracker.conf.sample tracker.conf
2.2.2 修改 tracker.conf 文件
默认指向的 FastDFS 作者余庆的目录,因为在我们的机器上不存在,所有手动改一下
[root@fastdfs01 fdfs]# vim tracker.conf
....
base_path=/opt/fastdfs/tracker #配置 tracker 存储数据的目录,必须存在的路径,需提前手动创建mkdir -p /opt/fastdfs/tracker
2.2.3 修改 storage.conf 文件
[root@fastdfs01 fdfs]# vim storage.conf
base_path=/opt/fastdfs/storage #storage 存储数据目录
store_path0=/opt/fastdfs/storage/files #真正存放文件的目录
tracker_server=10.0.0.120:22122 #注册当前存储节点的跟踪器地址
2.2.4 在 Linux 服务器上创建上面指定的目录
[root@fastdfs01 fdfs]# mkdir -p /opt/fastdfs/tracker
[root@fastdfs01 fdfs]# mkdir -p /opt/fastdfs/storage
[root@fastdfs01 fdfs]# mkdir -p /opt/fastdfs/storage/files
2.2.5 然后启动 FastDFS
2.3FastDFS 启动
FastDFS 服务启动需要启动两个脚本:
2.3.1 启动 FastDFS 的 tracker 服务
在任意目录下执行:fdfs_trackerd /etc/fdfs/tracker.conf
# 启动Tracker
# 方式一:
/etc/init.d/fdfs_trackerd start
# 方式二:(推荐)
service fdfs_trackerd start
# 方式三:
[root@fastdfs01 fdfs]# fdfs_trackerd /etc/fdfs/tracker.conf
# 检查Tracker
[root@fastdfs01 fdfs]# ps -ef |grep fdfs
root 2512 1 0 12:35 ? 00:00:00 fdfs_trackerd /etc/fdfs/tracker.conf
root 2520 1562 0 12:35 pts/0 00:00:00 grep --color=auto fdfs
[root@fastdfs01 fdfs]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 1024 *:22122 *:*
LISTEN 0 128 [::]:22 [::]:*
2.3.2 启动 FastDFS 的 storage 服务
在任意目录下执行:fdfs_storaged /etc/fdfs/storage.conf
# 启动Storage
# 方式一
/etc/init.d/fdfs_storaged start
# 方式二(推荐)
service fdfs_storaged start
# 方式三
[root@fastdfs01 fdfs]# fdfs_storaged /etc/fdfs/storage.conf
[root@fastdfs01 fdfs]# ps -ef |grep fdfs
root 2512 1 0 12:35 ? 00:00:00 fdfs_trackerd /etc/fdfs/tracker.conf
root 2541 1 8 12:37 ? 00:00:00 fdfs_storaged /etc/fdfs/storage.conf
root 2551 1562 0 12:38 pts/0 00:00:00 grep --color=auto fdfs
[root@fastdfs01 fdfs]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 1024 *:23000 *:*
LISTEN 0 1024 *:22122 *:*
LISTEN 0 128 [::]:22 [::]:*
2.3.3 查看启动进程
有启动的执行命令即为启动成功
2.3.4 查看 storage 是否已经注册到了 tracker 下
[root@fastdfs01 data]# fdfs_monitor /etc/fdfs/storage.conf
2.3.5 首次启动 storage 后,会在配置的路径下创建存储文件的目录
在data目录下,创建了256个子目录,每个子目录下又有256个子目录,有256的平方(65536)个目录存储文件
2.4FastDFS重启
2.4.1 重启 tracker
[root@fastdfs01 data]# fdfs_trackerd /etc/fdfs/tracker.conf restart
2.4.2 重启 storage
[root@fastdfs01 data]# fdfs_storaged /etc/fdfs/storage.conf restart
2.5 FastDFS 关闭
2.5.1 关闭 tracker 执行命令
在任意目录下执行:fdfs_trackerd /etc/fdfs/tracker.conf stop
[root@fastdfs01 data]# fdfs_trackerd /etc/fdfs/tracker.conf stop
2.5.2 关闭 storage 执行命令
在任意目录下执行:fdfs_storaged /etc/fdfs/storage.conf stop
[root@fastdfs01 data]# fdfs_storaged /etc/fdfs/storage.conf stop
2.5.3 kill 关闭 fastdfs
不建议在线上使用 kill -9 强制关闭,因为可能会导致文件信息不同步问题
2.6 FastDFS 测试
FastDFS 安装完成之后,可以使用 fdfs_test 脚本测试文件上传
2.6.1 测试之前,需要修改 client.conf 配置文件,修改两个配置
[root@fastdfs01 fdfs]# vim /etc/fdfs/client.conf
...
base_path=/opt/fastdfs/client
tracker_server=10.0.0.120:22122
- 在/opt/fastdfs/目录下创建 client
[root@fastdfs01 fdfs]# mkdir -p /opt/fastdfs/client
2.6.2 测试文件上传
- 准备需要上传的文件
[root@fastdfs01 ~]# cat aa.txt
This is FastDFS test!
- 执行上传命令
[root@fastdfs01 ~]# fdfs_test /etc/fdfs/client.conf upload /root/aa.txt
This is FastDFS client test program v5.11
Copyright (C) 2008, Happy Fish / YuQing
FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page http://www.csource.org/
for more detail.
[2024-06-26 13:55:29] DEBUG - base_path=/opt/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
# 跟踪器查询到一个存储节点
tracker_query_storage_store_list_without_group:
server 1. group_name=, ip_addr=10.0.0.120, port=23000
group_name=group1, ip_addr=10.0.0.120, port=23000
# 上传的文件的信息,FastDFS会对上传的文件进行重新命名
storage_upload_by_filename
# group_name 组名,文件上传到哪个组里面,这个组决定文件存储到哪个机器里面去;
# remote_filename 远程文件名称,M00对应tracker.conf中store_path0=/opt/fastdfs/storage/files #真正存放文件的目录,M00对应第一个磁盘路径,两块有可能对应M00、M01,三块有可能对应M00、M01、M02
group_name=group1, remote_filename=M00/00/00/CgAAeGZ7rVGAF-MQAAAAFif4PFE234.txt
source ip address: 10.0.0.120
file timestamp=2024-06-26 13:55:29
file size=22
file crc32=670579793
example file url: http://10.0.0.120/group1/M00/00/00/CgAAeGZ7rVGAF-MQAAAAFif4PFE234.txt
# 会上传两份文件,一份主,一份从
# fastDFS在存文件文件的时候,一般只需要存一份即可,如果存文件的话,会消耗空间,存从文件一般是存图片的时候,有的时候需要大图和小图,可以用这种方式
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/CgAAeGZ7rVGAF-MQAAAAFif4PFE234_big.txt
source ip address: 10.0.0.120
file timestamp=2024-06-26 13:55:29
file size=22
file crc32=670579793
example file url: http://10.0.0.120/group1/M00/00/00/CgAAeGZ7rVGAF-MQAAAAFif4PFE234_big.txt
[root@fastdfs01 ~]#
- 切换到存储目录查看文件上传情况
2.6.3 FastDFS 生成的文件目录结构及名称示例
2.6.4 测试文件下载
[root@fastdfs01 ~]# fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/CgAAeGZ7rVGAF-MQAAAAFif4PFE234.txt
[root@fastdfs01 ~]# ll
总用量 12
-rw-r--r-- 1 root root 22 2024-06-26 13:51 aa.txt
-rw-------. 1 root root 1354 2024-02-18 16:37 anaconda-ks.cfg
-rw-r--r-- 1 root root 22 2024-06-26 20:39 CgAAeGZ7rVGAF-MQAAAAFif4PFE234.txt
drwxr-xr-x 4 root root 116 2024-06-26 10:43 soft
2.6.5 测试文件删除
fdfs_delete_file /etc/fdfs/client.conf group1/要删除的文件路径
# 测试删除从文件
[root@fastdfs01 ~]# fdfs_test /etc/fdfs/client.conf delete group1 M00/00/00/CgAAeGZ7rVGAF-MQAAAAFif4PFE234_big.txt
[root@fastdfs01 ~]# ll /opt/fastdfs/storage/files/data/00/00/
总用量 8
-rw-r--r-- 1 root root 22 2024-06-26 13:55 CgAAeGZ7rVGAF-MQAAAAFif4PFE234.txt
-rw-r--r-- 1 root root 49 2024-06-26 13:55 CgAAeGZ7rVGAF-MQAAAAFif4PFE234.txt-m
2.6.6 注意
- 没有搭建集群默认只有一个组 group1
- 后缀名包含-m 的为属性文件(meta)
- 在 Linux 中并没有磁盘一说,是虚拟的
3、分布式文件系统 FastDFS的 HTTP 访问
3.1 概述
在文件上传的时候,上传成功的信息中有提示我们可以通过某个路径去访问上传的文件,但是我们直接访问这个路径,却不可以,那么已经上传到FastDFS文件系统中的文件,我们如何在浏览器中访问呢?
FastDFS 提供了一个Nginx扩展模块,利用该模块,我们可以通过Nginx访问已经上传到FastDFS上的文件
3.2 前期准备工作
3.2.1 将 Fastdfs 的 Nginx 扩展模块源代码上传到 Linux 上
3.2.2 解压下载下来的 fastdfs-nginx-module-master.zip 文件
unzip fastdfs-nginx-module-master.zip
3.3安装 Nginx 并且添加 fastDFS 模块
因为这个模块必须在 Nginx 的安装的过程中才能添加,所有我们需要重新安装一个nginx,为了和原来已安装的 Nginx 进行区分,我们把新安装的 Nginx 取名为 nginx_fdfs
3.3.1 将 Nginx 的 tar 包上传到 Linux 上
3.3.2 解压上传的 Nginx 文件
tar xf nginx-1.26.1.tar.gz
3.3.3 切换至解压后的 Nginx 主目录,执行配置操作
cd nginx-1.26.1
yum install pcre pcre-devel zlib zlib-devel -y
./configure --prefix=/usr/local/nginx_fdfs --add-module=/root/soft/fastdfs-nginx-module-1.20/src
--prefix # 是指定nginx安装路径
--add-module # 指定fastDFS的nginx模块的源代码路径
# 报错:
-o objs/addon/src/ngx_http_fastdfs_module.o \
/root/soft/fastdfs-nginx-module-master/src/ngx_http_fastdfs_module.c
In file included from /root/soft/fastdfs-nginx-module-master/src/common.c:26:0,
from /root/soft/fastdfs-nginx-module-master/src/ngx_http_fastdfs_module.c:6:
/usr/include/fastdfs/fdfs_define.h:15:27: 致命错误:common_define.h:没有那个文件或目录
#include "common_define.h"
^
编译中断。
make[1]: *** [objs/addon/src/ngx_http_fastdfs_module.o] 错误 1
make[1]: 离开目录“/root/soft/nginx-1.26.1”
make: *** [build] 错误 2
# 解决:
sed -i 's#ngx_module_incs="/usr/local/include"#ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"#g' /root/soft/fastdfs-nginx-module-1.20/src/config
sed -i 's#CORE_INCS="$CORE_INCS /usr/local/include"#CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"#g' /root/soft/fastdfs-nginx-module-1.20/src/config
3.3.4 执行命令进行编译
make
3.3.5 执行命令进行安装
make install
3.3.6 以上安装 Nginx 的 FastDFS 扩展模块注意事项
我们知道,Nginx 的安装需要 Linux 安装相关的几个库,否则编译会出现错误,这几个库分别是:
-
gcc 编译器是否安装
检查是否安装:yum list installed | grep gcc
执行安装:yum install gcc -y -
openssl 库是否安装
检查是否安装:yum list installed | grep openssl
执行安装:yum install openssl openssl-devel -y -
pcre 库是否安装
检查是否安装:yum list installed | grep pcre
执行安装:yum install pcre pcre-devel -y -
zlib 库是否安装
检查是否安装:yum list installed | grep zlib
执行安装:yum install zlib zlib-devel -y
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel –y
3.4FastDFS 的 Nginx 访问配置
3.4.1 拷贝mod_fastdfs.conf到/etc/fdfs/目录下
将/home/soft/fastdfs-nginx-module-master/src(自己实际存放 Nginx 扩展模块的目录)目录下的mod_fastdfs.conf 文件拷贝到 /etc/fdfs/目录下,这样才能正常启动 Nginx
cp /root/soft/fastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs/
3.4.2 修改 mod_fastdfs.conf 配置文件
vim /etc/fdfs/mod_fastdfs.conf
...
base_path=/opt/fastdfs/nginx_mod
tracker_server=10.0.0.120:22122
url_have_group_name = true
store_path0=/opt/fastdfs/storage/files
3.4.3 在/opt/fastdfs/目录下创建 nginx_mod 目录
mkdir -p /opt/fastdfs/nginx_mod
3.4.4 配置 Nginx 的配置文件
vim /usr/local/nginx_fdfs/conf/nginx.conf
...
location / {
...
}
# 拦截请求路径中包含 /group[1-9]/M0[0-9] 的请求,用 fastdfs 的Nginx模块进行转发
location ~ /group[1-9]/M0[0-9] {
ngx_fastdfs_module;
}
- ngx_fastdfs_module;
# 这个指令不是Nginx本身提供的,是扩展模块提供的,根据这个指令找到FastDFS提供的Nginx模块配置文件,然后找到Tracker,最终找到Stroager
3.5FastDFS 的 Nginx 访问启动与测试
3.5.1 启动带有 Fastdfs 模块的 Nginx
[root@fastdfs01 conf]# /usr/local/nginx_fdfs/sbin/nginx -t
ngx_http_fastdfs_set pid=17683
nginx: the configuration file /usr/local/nginx_fdfs/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx_fdfs/conf/nginx.conf test is successful
[root@fastdfs01 conf]# /usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf
ngx_http_fastdfs_set pid=17698
[root@fastdfs01 conf]# ps -ef |grep nginx
root 17699 1 0 21:57 ? 00:00:00 nginx: master process /usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf
nobody 17700 17699 0 21:57 ? 00:00:00 nginx: worker process
root 17702 1291 0 21:57 pts/1 00:00:00 grep --color=auto nginx
3.5.2 重启或启动 FastDFS 服务进程
fdfs_trackerd /etc/fdfs/tracker.conf restart
fdfs_storaged /etc/fdfs/storage.conf restart
3.5.3 上传一个文件进行测试验证
fdfs_test /etc/fdfs/client.conf upload /root/aa.txt
3.5.4 在浏览器访问上传的文件
当遇到400错误,检查配置/etc/fdfs/mod_fastdfs.conf中url_have_group_name=true,该配置表示访问路径中是否需要带有group1,改为true表示路径中需要有group1
3.5.5 扩展
模拟大型网站用户头像的处理方式,上传一张图片,然后自己写一个 html 页面,src指向上传的图片
3.5.6 FastDFS扩展模块执行流程
4、FastDFS 在 Java 项目中开发示例
4.1 在实际项目开发中,FastDFS 提供的主要功能
- upload:上传文件
- download:下载文件
- delete:删除文件
4.2 FastDFS 文件系统的 Java 客户端
FastDFS 文件系统 Java 客户端是指采用 Java 语言编写的一套程序,专门用来访问 fastDFS文件系统,其实就是一个 jar 包。
注意:大家如果能连上 mvnrepository 上搜索到的用友云提供的 fastdfs-client,那大家就下载那个 jar包使用,如果连不上,这个 jar 包需要我们自己来打
4.2.1 下载官方的源代码
从 https://codeload.github.com/happyfish100/fastdfs-client-java/zip/master 上下载FastDFS 源代码到本地
4.2.2 解压
4.2.3 采用 maven 命令编译成 jar 安装到本地 maven 库
- 本地默认配置java环境变量和Maven环境变量(没有的话需要自己下载配置)
mvn clean install
4.2.4 在 Java 程序中使用它提供的 API 来访问 FastDFS 文件系统
4.3文件上传功能的实现
4.3.1 需求
使用 Java 客户端,编程操作 fastDFS 分布式文件系统,上传本地文件到 FastDFS 服务器上
4.3.2 实现步骤
(1) 使用 IDEA 创建普通的 maven 项目,不需要使用
(2) 在 pom.xml 文件中添加我们打包好的 FastDFS 本地仓库的jar 包(FastDFS 的 java 客户端依赖)
可以在这查看 jar 包里面的内容
(3) 拷贝源代码包中的 fdfs_client.conf 文件到 resources 目录下,在里面主要配置 tracker 地址
(4) 编写代码,进行上传测试
在 com.bjpowernode.fastdfs 包下创建 FastDFS 类,在其中编写上传代码
package com.bjpowernode.fastdfs;
import com.sun.deploy.util.SessionState;
import org.csource.common.MyException;
import org.csource.fastdfs.*;
import java.io.IOException;
public class FastDFSUtil {
public static void main(String[] args) {
upload();
}
/**
* 文件上传
*/
public static void upload() {
TrackerServer ts=null;
StorageServer ss=null;
try {
//读取FastDFS的配置文件用于将所有的tracker的地址读取到内存中
ClientGlobal.init("fastdfs.conf");
TrackerClient tc=new TrackerClient();
ts=tc.getConnection();
ss=tc.getStoreStorage(ts);
//定义Storage的客户端对象,需要使用这个对象来完成具体的文件上传、下载和删除
StorageClient sc=new StorageClient(ts,ss);
/**
* 文件上传
* 参数 1 为需要上传的文件的绝对路径
* 参数 2 为需要上传的文件的扩展名
* 参数 3 为文件的属性文件通常不上传
* 返回一个string数组 这个数据对我们非常重要必须妥善保管建议存入数据库
* 数组中的第一个元素为文件所在的组名
* 数组中的第二个元素为文件所在的远程路径名称
*/
String[] result= sc.upload_file("d:/Ansible.png","png",null);
for (String str:result){
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
} finally {
if (ss!=null){
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (ts!=null){
try {
ts.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(5) 运行程序,在 Linux 上,FastDFS 存储目录下查看上传文件内容