FastDFS单节点部署

news2024/10/21 11:07:58

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.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 ~]# 
  • 切换到存储目录查看文件上传情况

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.coloradmin.cn/o/2219985.html

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

相关文章

python爬虫快速入门之---Scrapy 从入门到包吃包住

python爬虫快速入门之—Scrapy 从入门到包吃包住 文章目录 python爬虫快速入门之---Scrapy 从入门到包吃包住一、scrapy简介1.1、scrapy是什么?1.2、Scrapy 的特点1.3、Scrapy 的主要组件1.4、Scrapy 工作流程1.5、scrapy的安装 二、scrapy项目快速入门2.1、scrapy项目快速创建…

Spring Boot框架下JavaWeb在线考试系统的创新实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

JavaFx学习--chapter02(网络对话)

chapter02(网络对话) 简单网络对话程序 设计任务:客户端向服务器发送字符串,并能读取服务器返回的字符串。 知识点:TCP套接字技术,C/S软件架构程序设计 重点理解:Java客户套接字类Socket和服务器套接字类ServerSoc…

docker配置加速器

阿里云 控制台》容器镜像服务》镜像工具》镜像加速器 复制地址:https://ywtoq7bz.mirror.aliyuncs.com 到:etc/docker下:vi daemon.json 格式: { "registry-mirrors": ["加速器地址"] } 注&#xff1…

Visual Studio 2022安OpenCV可视化工具image watch

1. 打开 VS2022 ,扩展 -管理扩展 2. 搜索 Image Watch 关闭VS2022 后 安装 打开视图、调出 Image Watch 窗口 测试代码: #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.…

Transformer(Vit+注意力机制)

文献基本信息: Encoder-Decoder: Transformer的结构: 输入编码器解码器输出 Transformer的工作流程: 获取输入句子的每一个单词的表示向量X,X由单词的embedding(embedding是一种将高维特征映射到低维的技…

opencv出错以及解决技巧

opencv配置 一开始&#xff0c;include的路径是<opencv4/opencv2/…> 这样在using namespace cv的时候导致了报错&#xff0c; 所以在cmakelist中需要对cmake的版本进行升级。 set(CMAKE_CXX_FLAGS “-stdc14 -O0 -Wall”)-O0 表示在编译过程中不进行任何优化 对应的pac…

Linux操作系统如何制作U盘启动盘

在麒麟系统中有一款U盘启动器软件&#xff0c;它是用于制作系统启动U盘的工具&#xff0c;方便无光驱的电脑安装操作系统&#xff0c;也可以反复使用一个U盘&#xff0c;避免光盘的浪费。下面对该U盘启动器使用方法做详细讲解。 1.准备需要安装的系统镜像文件。 图 1 2.准备1…

Node-RED开源项目的modbus通信(TCP)

一、Modbus 通信协议 Modbus是一种串行通信协议&#xff0c;是Modicon公司&#xff08;现在的施耐德电气 Schneider Electric&#xff09;于1979年为使用可编程逻辑控制器&#xff08;PLC&#xff09;通信而发表。Modbus已经成为工业领域通信协议的业界标准&#xff08;De fact…

Redis高阶篇之Redis单线程与多线程

文章目录 0 前言1. 为什么Redis是单线程&#xff1f;1.1 Redis单线程1.2 为什么Redis3时代单线程快的原因1.3 使用单线程原因 2.为什么逐渐加入多线程呢&#xff1f;2.1 如何解决 3.redis6/7的多线程特性和IO多路复用入门3.1主线程和IO线程怎么协作完成请求处理的3.2 Unix网络编…

政府采购合同公告明细数据(1996-2024年)

透明度成为了公众对政府活动的基本要求之一。特别是在政府采购领域&#xff0c;透明度不仅关系到公共资源的合理分配&#xff0c;更是维护市场公平竞争的重要保障。政府采购合同公告制度正是为了满足这一需求而设立的。 1996-2024年政府采购合同公告明细数据&#xff08;dta文…

Perl打印9x9乘法口诀

本章教程主要介绍如何用Perl打印9x9乘法口诀。 一、程序代码 1、写法① use strict; # 启用严格模式&#xff0c;帮助捕捉变量声明等错误 use warnings; # 启用警告&#xff0c;帮助发现潜在问题# 遍历 1 到 9 的数字 for my $i (1..9) {# 对于每个 $i&#xff0c;遍历 1…

Javascript 脚本查找B站限时免费番剧

目录 前言 脚本编写 脚本 前言 B站的一些番剧时不时会“限时免费”&#xff0c;白嫖党最爱&#xff0c;主打一个又占到便宜的快乐。但是在番剧索引里却没有搜索选项可以直接检索“限时免费”的番剧&#xff0c;只能自己一页一页的翻去查看&#xff0c;非常麻烦。 自己找限…

Git极速入门

git初始化 git -v git config --global user.name "" git config --global user.email "" git config --global credential.helper store git config --global --list省略(Local) 本地配置&#xff0c;只对本地仓库有效–global 全局配置&#xff0c;所有…

spring boot yml文件中引用*.properties文件中的属性

1、首先在*.properties文件中加入一个属性&#xff0c;如&#xff1a; 2、然后再application.yml文件中通过${jdbc.driver}来引用&#xff0c;如&#xff1a; 3、然后再创建一个资源配置类&#xff0c;通过PropertySource来引入这个*.properties文件&#xff0c;如&#xff1…

JDK中socket源码解析

目录 1、Java.net包 1. Socket通信相关类 2. URL和URI处理类 3. 网络地址和主机名解析类 4. 代理和认证相关类 5. 网络缓存和Cookie管理类 6. 其他网络相关工具类 2、什么是socket&#xff1f; 3、JDK中socket核心Api 4、核心源码 1、核心方法 2、本地方法 3、lin…

基于stm32的esp8266的WIFI控制风扇实验

实验案例&#xff37;&#xff29;&#xff26;&#xff29;控制风扇 项目需求 电脑通过esp8266模块远程遥控风扇。 项目框图 ​ 风扇模块封装 #include "sys.h" #include "fan.h"void fan_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟…

4K Mini-LED显示器平民价,一千多的联合创新27M3U到底有多香

哈喽小伙伴们好&#xff0c;我是Stark-C~ 要说前几年买显示器还是普通IPS的天下&#xff0c;那个时候虽说也有MiniLED或者OLED显示器&#xff0c;但是价格那也是真贵啊&#xff0c;毕竟那个时候MiniLED和OLED还没普及&#xff0c;只有一些高档电视或者显示器才会用到此技术。不…

OpenCV高级图形用户界面(18)手动设置轨迹条(Trackbar)的位置函数setTrackbarPos()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数设置指定窗口中指定轨迹条的位置。 注意 [仅 Qt 后端] 如果轨迹条附加到控制面板&#xff0c;则 winname 可以为空。 函数原型 void cv…

三周精通FastAPI:4 使用请求从客户端(例如浏览器)向 API 发送数据

FastAPI官网手册&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/query-params/ 上节内容&#xff1a;三周精通FastAPI&#xff1a;3 查询参数 请求 FastAPI 使用请求从客户端&#xff08;例如浏览器&#xff09;向 API 发送数据。 请求是客户端发送给 API 的数据。响…