FastDFS 的一系列踩坑

  • 1. 什么是 FastDFS
  • 2. 为什么要使用 FastDFS
  • 3. FastDFS 安装【CentOS】
    • 3.1 Tracker 安装
    • 3.2 Storage 安装
  • 4. Java 客户端测试
    • 4.1 文件上传功能测试
  • 5. Nginx 安装
    • 5.1 安装 Nginx【CentOS】
    • 5.2 安装 fastdfs-nginx-module
  • 6. Java 客户端访问图片测试
  • 7. 文件下载
  • 8. 安全问题
  • 9. 踩坑过程【22122端口没有开放】

1. 什么是 FastDFS

  • FastDFS 由淘宝的余庆大佬开源的一款轻量级分布式文件管理系统

2. 为什么要使用 FastDFS

  • 传统的企业级开发对于高并发要求不是很高,而且数据量也不会很大,在这样的环境下文件管理可能很简单,但是互联网应用访问量大、数据量大,在互联网就需要考虑解决文件大容量存储和高性能访问的问题,而 FastDFS 就适合干这件事情,常见的图片存储、视频存储、文档存储等等都可以采用 FastDFS 来做。

3. FastDFS 安装【CentOS】

  • 图片上传功能使用 FastDFS,图片上传成功之后,接下来的图片访问我们一般采用 Nginx,所以需要安装三个软件包。

    • Tracker 安装
    • Storage 安装
    • Nginx 安装

3.1 Tracker 安装

安装,首先准备一个环境两个库以及一个安装包。
【1. 一个环境】
因为 FastDFS 采用 C 语言开发,安装前,需要先安装 gcc 环境。命令如下:

yum install gcc-c++

【2. 两个库】
由于 FastDFS 依赖 libevent 库,安装命令如下:

yum -y install libevent

另一个库是 libfastcommon,这是 FastDFS 官方提供的,它包含了 FastDFS 运行所需要的一些基础库。
libfastcommon 下载地址,本人已经下载好,并不算很大,分享到了百度网盘,可以方便大家下载:百度网盘下载地址:提取码:kpii
里面提供的三个软件都是必备的哦!
将下载好的 libfastcommon 拷贝至 /usr/local/ 目录下,然后依次执行以下命令:
由于我们下到了本地,我们可以通过 Xftp 这个工具来将我们的安装包【libfastcommon-1.0.43.tar.gz】拉到 CentOS 上面去。【当大家拉取完成后】

// 进入目录中
cd /usr/local
// 对其解压
tar -zxvf libfastcommon-1.0.43.tar.gz
// 解压完进入文件夹中
cd libfastcommon-1.0.43
// 剩下的就是编译安装了
./make.sh
./make.sh install

【3. 一个安装包】
网盘中已经分享,下载到本地后,通过 Xftp 将文件 【fastdfs-6.06.tar.gz】拷贝到 /usr/local 目录下,然后依次执行以下命令安装:

cd /usr/local
tar -zxvf fastdfs-6.06.tar.gz
cd fastdfs-6.06
./make.sh
./make.sh install

安装成功后,执行如下命令,将安装目录内 conf 目录下的配置文件拷贝到 /etc/fdfs目录下:【目录不用创建,cp 命令会帮你创建的】

cd conf/
cp ./* /etc/fdfs/

【4. 配置】
接下来进入 /etc/fdfs/ 目录下进行配置:
打开 tracker.conf 文件:

cd /etc/fdfs/
vim tracker.conf

修改如下配置:

默认端口是 22122,可以跟据实际需求修改,然后再配置以下元数据的保存目录(注意目录要存在)。
【5. 启动】
接下来执行如下命令启动 Tracker:

/usr/bin/fdfs_trackerd  /etc/fdfs/tracker.conf start

3.2 Storage 安装

Storage 本身的安装和 Tracker 一致,执行命令都一样,因为这里我将 Tracker 和 Storage 安装再同一台服务器上,所以不用再执行安装命令了(相当于安装了 Tracker 时已经安装了 Storage 了)。
唯一要做的,就是进入到 /etc/fdfs 目录下,配置 Storage:

cd /etc/fdfs/
vim storage.conf



这里一共配置了三个地方,分别是 base_path、store_path0、tracker_server,tracker_server 模板有两个地址,我们注释一个,另一个修改成自己的虚拟机Ip。
配置完成后,再次启动 Storage:

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
  • 目前为止,我们已经配置号 Tracker 和 Storage 了,并且二者都已经启动了。这两个启动完成后,现在就可以做文件的上传了,但是一般如果是图片文件,我们还需要提供一个图片的访问功能,目前来说最佳方案是 Nginx。
  • 我们先来测试看看 Tracker 和 Storage 配置的有没有问题,看看文件上传功能是否能够跑通,当测试完全没问题了,我们再去安装 Nginx,再去实现访问图片的功能。

4. Java 客户端测试

首先我们创建一个普通的 Mavne 工程,添加如下依赖:

<dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-java</artifactId><version>1.27.0.0</version>
</dependency>

然后,在项目的 resources 目录下添加 FastDFS 的配置文件 fastdfs-client.properties,内容如下:

fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port = 80
fastdfs.tracker_servers = 192.168.91.128:22122
fastdfs.connection_pool.enabled = true
fastdfs.connection_pool.max_count_per_entry = 500
fastdfs.connection_pool.max_idle_time = 3600
fastdfs.connection_pool.max_wait_time_in_ms = 1000

其中 fastdfs.tracker_servers 是 Tracker 的地址,大家跟据自己的虚拟机Ip配置即可。

4.1 文件上传功能测试

代码如下:

    @Testvoid contextLoads() throws IOException, MyException {ClientGlobal.initByProperties("fastdfs-client.properties");TrackerClient trackerClient = new TrackerClient();TrackerServer trackerServer = trackerClient.getConnection();StorageServer storageServer = null;StorageClient1 client1 = new StorageClient1(trackerServer, storageServer);NameValuePair pairs[] = null;String fileId = client1.upload_file1("C:\\Users\\bai\\Pictures\\Camera Roll\\img\\javaboy.jpg", "jpg", pairs);System.out.println(fileId);}
  • 首先这里加载配置文件,然后构造一个 TrackerClient 对象,接着再跟据这个对象获取到一个 TrackerServer,然后再创建一个 StorageClient1 实例。NameValuePair 中保存的就是文件的元数据信息,如果有的话,就以 key/value 的方式来设置,如果没有直接给一个 null 即可。

  • 最后调用 client 的 upload_file1 方法上传文件,第一个参数是文件路径,第二个参数是文件的扩展名,第三个参数是文件的元数据信息,这个方法的返回值,就是上传文件的访问路径,执行该方法,打印日志如下:

  • group1/M00/00/00/wKj9gF6dngqASrBQAAAT8J10-TU753.jpg 就是文件的路径,如果你的测试结果也是这样就证明上传文件的功能没有问题。

5. Nginx 安装

  • 这时我们就可以通过安装 Nginx 来完成访问图片的功能:
  • Nginx 的安装分为两个步骤:
    • 安装 Nginx
    • 在 Storage 下安装 fastdfs-nginx-module

5.1 安装 Nginx【CentOS】

  1. 首先下载 Nginx
wget http://nginx.org/download/nginx-1.17.0.tar.gz
  1. 然后解压下载的目录,进入解压目录中,在编译安装之前,需要安装两个依赖:
yum -y install pcre-devel
yum -y install openssl openssl-devel
  1. 然后开始编译安装
./configure
make
make install
  1. 装好之后,默认安装位置在:
/usr/local/nginx/sbin/nginx
  1. 进入到该目录的 sbin 目录下,执行 nginx 即可启动 nginx【我们这里先不要启动nginx】

5.2 安装 fastdfs-nginx-module

【百度网盘已经下载好的】,将下载好的文件拷贝到 /usr/local 目录下,进入 /usr/local 目录,分别执行如下命令:

cd /usr/local
tar -zxvf fastdfs-nginx-module-1.22.tar.gz

然后将 /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf 文件拷贝到 /etc/fdfs 目录下,并修改文件的内容:

cp /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf

  • 接下来,回到第一步下载的 nginx 安装文件的解压目录中,执行如下命令,重新配置编译安装:
./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src
make
make install
  • 安装完成后,修改 nginx 的配置文件,如下:
vim /usr/local/nginx/conf/nginx.conf

  • 在这里配置 nginx 请求转发。
  • 配置完成后,启动 nginx ,看到如下日志,表示 nginx 启动成功:
// 首先进入 nginx 的目录中去
cd /usr/local/nginx/sbin/
// 启动 nginx
./nginx
// 启动成功后的打印日志
ngx_http_fastdfs_set pid=20932

全部安装成功了。

6. Java 客户端访问图片测试

  • 由于上面我们已经完成了文件上传的功能,并且拿到了文件Id,也就是如下图所示:
  • 此时在浏览器中输入http://192.168.91.128/group1/M00/00/00/wKj9gF6dkA-AeHQ1AAAT8J10-TU507.jpg 就可以看到上传的图片了。

7. 文件下载

    @Testvoid download() throws IOException, MyException {ClientGlobal.initByProperties("fastdfs-client.properties");TrackerClient trackerClient = new TrackerClient();TrackerServer trackerServer = trackerClient.getConnection();StorageServer storageServer = null;StorageClient1 client1 = new StorageClient1(trackerServer, storageServer);byte[] bytes = client1.download_file1("group1/M00/00/00/wKj9gF6da6yAU-EMAAAT8J10-TU390.jpg");FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\bai\\Pictures\\Camera Roll\\img\\javaboy2.jpg"));fos.write(bytes);fos.close();}

-代码解释:直接调用 download_file1 方法获取到一个 byte 数组,然后通过 IO 流写出到本地文件即可。

8. 安全问题

  • 现在任何人都能访问我们服务器上的文件,这肯定不安全,在上传的时候加上令牌即可。
  • 首先我们在服务端开启令牌校验:
vim /etc/fdfs/http.conf

  • 配置完成后,重启服务器:
./nginx -s stop
./nginx
  • 接下来,准备一个获取令牌的方法,如下:
    @Testvoid getToken() throws UnsupportedEncodingException, NoSuchAlgorithmException, MyException {int ts = (int) Instant.now().getEpochSecond();String token = ProtoCommon.getToken("M00/00/00/wKj9gF6dkA-AeHQ1AAAT8J10-TU507.jpg", ts, "FastDFS1234567890");StringBuilder sb = new StringBuilder();sb.append("http://192.168.253.128").append("/group1/M00/00/00/wKj9gF6dkA-AeHQ1AAAT8J10-TU507.jpg").append("?token=").append(token).append("&ts=").append(ts);System.out.println(sb.toString());}
  • 这里我们主要是跟据 ProtoCommon.getToken 方法来获取令牌,注意这个方法的第一个参数就是你要访问的文件 id,注意,这个地址里边不要包含 group,千万别搞错了,第二个参数是时间戳,第三个参数是密钥,密钥要和服务端的配置一致。
  • 此时我们运行此方法,然后控制台打印一个路径,我们就可以点击去访问了【如果此时将路径中的 token去掉,就会访问失败,默认展示的就是 nginx 的错误页面】。

9. 踩坑过程【22122端口没有开放】

如果你的配置文件没有问题,但是发生连接不上 22122 这个端口的话,原因就是你的 防火墙没有开发 22122 着端口号,只要你开启了 22122 端口号就能避免这个错误了。

FastDFS 的安装、使用、踩坑过程相关推荐

  1. centos7 安装esrally 踩坑过程

    背景: 为了压测下新ES集群性能,使用es官网推荐的Esrally.因为网络差异, 按照官网的步骤来,一步一个坑那基本上就是下载很慢,半天过去爬不出来. 所以那个简洁的命令有很多依赖前置条件.不然就是 ...

  2. superset安装踩坑过程总结

    搭建这个superset花了我两天的时间,作为一个小白翻遍了全网,但其实都是些很小的问题,感谢网上大腿们的无私贡献,才得以成功,真的自学太难了-- Windows10,64bit 先避坑(我前面花了1 ...

  3. GPCC安装以及踩坑经历

    gpcc安装以及踩坑经历 官方下载地址文档 https://network.pivotal.io/products/pivotal-gpdb#/releases/29190 安装开始之前 chown ...

  4. centos 8 使用 nmcli 配置网桥Bridge(最后有踩坑过程)

    文章最后有踩坑过程,前面先写正常流程. 背景:最近想在自己笔记本上搭建openstack集群,再在集群上面上面跑K8S. 首先需要准备两个网络供虚拟机使用,一个网络用于连接互联网用来在线安装各种服务和 ...

  5. HBase眼高手低从Shell到IDEA编程、心路笔记、踩坑过程

    HBase眼高手低从Shell到IDEA编程.心路笔记.踩坑过程 HBase眼高手低 通过shell操作Hbase Foundation 在terminal中输入hbase,就可以查看hbase命令的 ...

  6. cmd命令安装composer踩坑

    cmd命令安装composer踩坑 很多童鞋在依照composer官网 官网教程 用命令行安装composer时回踩到以下坑,却不知道如何解决 在此我分享下自己的经验,写个不好请多海涵 打开命令行执行 ...

  7. java 做项目踩坑,web项目踩坑过程

    sql函数设计: 一开始本来是直接用Java的jdbc直接传输操作语句的.但后来学了存储过程发现存储过程可以提高不少的效率.就重构了自己对数据库的操作代码.包括:开启,查找,修改,关闭. 开启:直接使 ...

  8. ubuntu 20.04 安装软件踩坑

    ubuntu 20.04 安装软件踩坑 1.搜狗输入法 安装后需要重启一次 重启后讲sogoupinyin添加好,右上角如果没有搜狗就再重启一下 右上角出现了搜狗也是打不出中文的,因为没有安装依赖 安 ...

  9. 记录一次C语言调用go生成的动态库的踩坑过程

    记录一次C语言调用go生成的动态库的踩坑过程 问题现象 由于某些特殊原因,需要在C语言中调用go语言生成的so,本来挺顺利,一切都运行的很好.突然某一天,不知道怎么回事,再一个新程序中无法正常运行了, ...

最新文章

  1. 矩阵乘法的性能提升 AutoKernel
  2. 从谷歌离职回到西湖大学,只为让AI听懂你的悲伤!
  3. Linux磁盘分区管理(转载)
  4. mysql 按月统计 包括空月_mysql 按月统计但是有几个月没有数据,需要变成0
  5. linux fedora35安装、登录postgresql-14数据库命令整理
  6. java框架_2020年Java框架排行榜,谁居榜首?
  7. 如何定位和处理手机游戏内存泄露
  8. 列出文件夹下所有文件命令
  9. microsoft账号登陆一直在加载_英雄联盟手游下载,附带拳头账号注册教程
  10. 安装oracle9i时提示找不到文件OCS4J.properties的解决方法
  11. 社区团购的坑,只有巨头能填?
  12. ASP.NET Core 和 Blazor 更新
  13. day14【前台】用户登录注册
  14. cpu核心 线程 进程_科个普:进程、线程、并发、并行
  15. MySQL 这三道必问面试题,你都会吗?
  16. bios error 装系统acpi_win10系统升级后开机提示acpi bios error的解决方法
  17. 福州化工实验室建设注意隐患分析
  18. 【LaTeX】矢量图转为pdf格式(为了将高清矢量图插入LaTeX)
  19. 如何在 arm 官网上找到合适的手册
  20. AMP—Rover移植

热门文章

  1. 80老翁谈人生(315):彻夜未眠,思考对策;增强定力,反击违纪派
  2. 24.类加载器命名空间实战剖析与透彻理解
  3. 时序分析基本概念介绍Skew
  4. win10笔记本WLAN已关闭,无法打开,解决办法
  5. 微信小程序--》小程序生命周期和WXS使用
  6. Lab: Authentication bypass via flawed state machine:通过丢包绕过身份验证登录
  7. 微信小程序抓取网页数据
  8. animator 控制移动_Unity 又是一坑之移动AnimatorState
  9. 考完了托福,总结一下9天复习参加托福的经验吧
  10. 【C++OpenCV】实现微信跳一跳完整项目代码