FastDFS单节点部署

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的文件系统。

分布式文档系统对比

  • 分布式文件系统与传统文件系统对比

image-20240626090622675

  • 传统方式弊端:
    • 如果用户数量多,IO操作比较多,对磁盘访问压力很大
    • 如果磁盘发生故障,会造成数据丢失
    • 存储容量有限

image-20240626091636482

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上传文件交互过程

  1. client询问tracker上传到的storage,不需要附加参数;
  2. tracker返回一台可用的storage
  3. client直接和storage通讯完成文件上传

FastDFS下载文件交互过程

  1. client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
  2. tracker返回一台可用的storage
  3. 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)

image-20240626103552273

(2) 解压下载下来的 tar.gz 压缩包到当前目录

tar -zxvf libfastcommon-1.0.36.tar.gz

(3) 切换到解压后的 libfastcommon 目录

cd libfastcommon-1.0.36

(4) 执行 make 脚本进行编译

./make.sh

image-20240626103815357

注意: make 编译的时候如果报错,需解决错误后再次进行 make,通常发生错误是由于 Linux 缺少某些依赖库导致,根据错误提示解决错误

(5) 执行 make install 进行安装

./make.sh install

image-20240626104015100

#安装完成提示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)
image-20240626104214550

(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

image-20240626104422499

# 验证  
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*

image-20240626110515528

  • 查看 FastDFS 的配置文件
ll /etc/fdfs/

image-20240626110556838

(7) 另外注意需要把解压后的 fastdfs-5.11/conf 目录下的两个文件拷贝到/etc/fdfs/ ,否则后续会有很多奇怪问题不好解决

cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/

image-20240626110930989

​ 这两个文件后续需要用到,所以先拷贝过去

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 查看启动进程

image-20240626123902594

有启动的执行命令即为启动成功

2.3.4 查看 storage 是否已经注册到了 tracker 下

[root@fastdfs01 data]# fdfs_monitor /etc/fdfs/storage.conf

image-20240626124520569

2.3.5 首次启动 storage 后,会在配置的路径下创建存储文件的目录

image-20240626124654271

在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.11Copyright (C) 2008, Happy Fish / YuQingFastDFS 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=23000group_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 ~]# 
  • 切换到存储目录查看文件上传情况

image-20240626201401918

2.6.3 FastDFS 生成的文件目录结构及名称示例

image-20240626201513539

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 上

image-20240626205535700

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 上

image-20240626205805608

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

image-20240626220219952

3.5.5 扩展

模拟大型网站用户头像的处理方式,上传一张图片,然后自己写一个 html 页面,src指向上传的图片

3.5.6 FastDFS扩展模块执行流程

image-20240627085446078

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 解压

image-20240627152143177

4.2.3 采用 maven 命令编译成 jar 安装到本地 maven 库

  • 本地默认配置java环境变量和Maven环境变量(没有的话需要自己下载配置)
mvn clean install

image-20240627152329715

image-20240627152004855

4.2.4 在 Java 程序中使用它提供的 API 来访问 FastDFS 文件系统

4.3文件上传功能的实现

4.3.1 需求

使用 Java 客户端,编程操作 fastDFS 分布式文件系统,上传本地文件到 FastDFS 服务器上

4.3.2 实现步骤

(1) 使用 IDEA 创建普通的 maven 项目,不需要使用

image-20240627165544062

image-20240627165609808
(2) 在 pom.xml 文件中添加我们打包好的 FastDFS 本地仓库的jar 包(FastDFS 的 java 客户端依赖)
image-20240627165855861

image-20240627165940197

可以在这查看 jar 包里面的内容

image-20240627170147284

(3) 拷贝源代码包中的 fdfs_client.conf 文件到 resources 目录下,在里面主要配置 tracker 地址

image-20240627170320742

(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 存储目录下查看上传文件内容

image-20240627170459671

image-20240627170641481

image-20240627171212457

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/882456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

即使是编程新手,也能利用ChatGPT编写高质量的EA

在外汇交易领域,MetaTrader是一款备受欢迎的交易软件,包括MT5和MT4,提供了众多强大的分析工具和自动化交易功能。对于没有编程经验的新手而言,编写专家顾问(EA)可能显得既复杂又令人望而却步。幸运的是&…

数据结构——链表,哈希表

文章目录 链表python实现双向链表复杂度分析 哈希表(散列表)python实现哈希表哈希表的应用 链表 python实现 class Node:def __init__(self, item):self.item itemself.next Nonedef head_create_linklist(li):head Node(li[0])for element in li[1…

spring6 IoC容器详解

目录 一、引言 示例开发 示例分析 启用Log4j2日志框架 使用方式 二、IoC容器 IoC容器 1.控制反转(IoC) 2.依赖注入 3.IoC容器在Spring的实现 基于XML管理Bean 依赖注入之setter注入 依赖注入之构造器注入 Bean生命周期 基于xml自动装配 …

基于SSM+微信小程序的打印室预约管理系统(打印2)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的打印室预约管理系统实现了管理员和用户两个角色。 1、管理员功能有个人中心,用户管理,附近打印店管理,文件打印管理,当…

ui自动化知识点-web端

UI : User Interface( ⽤户接⼝ - ⽤户界⾯ ) ,主要包括: app 、 web ui ⾃动化测试:使⽤⼯具或代码执⾏⽤例的过程 什么样的项⽬适合做⾃动化:1、需要回归测试项⽬(甲⽅⾃营项⽬、⾦融、电商)2、需求变动不频繁:稳定的模块3、项⽬周期⻓的项⽬:(甲⽅⾃营项⽬、6个…

YOLO11改进 | 主干网络 | 将backbone替换为Swin-Transformer结构【论文必备】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 本文给大家带来的教程是将YOLO11的backb…

LaTeX教程(016)-LaTeX文档结构(16)

LaTeX教程(016)- LaTeX \LaTeX LATE​X文档结构(16) 接上一讲 我们前面知道,\vref是对\ref的升级,而varioref包也提供了一个对\pageref升级的命令\vpageref。它和\vref的原理很相似,内置了一些判断。 \vpageref[same-page][other-page]{ke…

【C++】C++当中的复合类型——引用和指针

C当中的复合类型 最近开始系统地学习 C 的语法,参考的主要资料来自于 C Primer 第五版,对于学习过程中所遇到的较难理解的点,我会以blog的形式对问题和内容进行记录,并进行进一步地探讨。 这一部分的内容对应于参考资料 C Prime…

spring-cloud-alibaba-nacos-config2023.0.1.*启动打印配置文件内容

**背景:**在开发测试过程中如果可以打印出配置文件的内容,方便确认配置是否准确;那么如何才可以打印出来呢; spring-cloud-alibaba-nacos-config 调整日志级别 logging:level:com.alibaba.cloud.nacos.configdata.NacosConfigD…

Linux操作系统与windows无法相互复制问题

请先看完此文在进行操作!!! 对于无法复制我们逐层分析: 1.为什么无法复制是不是少了什么工具(open-vm-tools-destop) 上网查阅可以看到如下 2.在此之前我的虚拟机装完Ubuntu 16.04的linux系统无法进行apt update(参考一下) li…

华三服务器R4900 G5在图形界面使用PMC阵列卡(P460-B4)创建RAID,并安装系统(中文教程)

环境以用户需求安装Centos7.9,服务器使用9块900G硬盘,创建RAID1和RAID6,留一块作为热备盘。 使用笔记本通过HDM管理口()登录 使用VGA()线连接显示器和使用usb线连接键盘鼠标,进行窗…

excel判断某一列(A列)中的数据是否在另一列(B列)中

如B列如果有7个元素,在A列右边的空白列中,输入如下公式: COUNTIF($B$1:$B$7,A1), 其中,$B$1:$B$7代表A列中的所有数据即绝对范围,A1代表B列中的一个单元格.

Servlet(一)

一.什么是servlet Servlet 是一种实现动态页面的技术。 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app。 1.回顾 动态页面 vs 静态页面 静态页面也就是内容始终固定的页面。即使 用户不同/时间不同/输入的参数不同 , 页面内容也不会发生变化。(除…

从 Microsoft 官网下载 Windows 10

方法一: 打开 Microsoft 官网: 打开开发人员工具(按 F12 或右键点击“检查”)。 点击“电脑模拟手机”按钮,即下图: 点击后重新加载此网页,即可看到下载选项。

Palo Alto Networks Expedition 未授权SQL注入漏洞复现(CVE-2024-9465)

0x01 产品介绍: Palo Alto Networks Expedition 是一款强大的工具,帮助用户有效地迁移和优化网络安全策略,提升安全管理的效率和效果。它的自动化功能、策略分析和可视化报告使其在网络安全领域中成为一个重要的解决方案。 0x02 漏洞描述&am…

windows下安装、配置neo4j并服务化启动

第一步:下载Neo4j压缩包 官网下载地址:https://neo4j.com/download-center/ (官网下载真的非常慢,而且会自己中断,建议从以下链接下载) 百度网盘下载地址:链接:https://pan.baid…

周易解读:八卦02,八卦所代表的基本事物

八 卦02 上一节,我是讲完了八卦的卦象的画法的问题。这一节,我来尝试着去讲解八卦所代表的自然事物。 八卦是谁发明的呢?根据《周易说卦传》的说法,八卦是伏羲发明的。伏羲氏仰观天文,俯察地理,从中提取…

项目模块二:日志宏

一、代码展示 二、补充知识 1、LOG(level, format, ...) format 是用于宏识别格式化,类似于 printf("%s", str); 里面的 "%s" ... 不定参,传入宏的参数除了 level, format, 还有不确定个数的参数。 2、红色 \ 由于宏只能写在一…

链上相遇,节点之间的悸动与牵连

公主请阅 1. 返回倒数第 k 个节点1.1 题目说明1.2 题目分析1.3 解法一代码以及解释1.3 解法二代码以及解释 2.相交链表2.1 题目说明示例 1示例 2示例 3 2.2 题目分析2.3 代码部分2.4 代码分析 1. 返回倒数第 k 个节点 题目传送门 1.1 题目说明 题目名称: 面试题 02…

15分钟学 Go 第 10 天:函数参数和返回值

第10天:函数参数和返回值 目标:理解函数如何传递参数 在Go语言中,函数是程序的基本构建块。了解如何传递参数和返回值是编写高效、可复用代码的重要步骤。本文将详细讲解函数参数的类型、传递方式以及如何处理返回值,辅以代码示…