FastDFS 的安装、使用、踩坑过程

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 文件上传功能测试

代码如下:

    @Test
    void 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. 文件下载

    @Test
    void 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
  • 接下来,准备一个获取令牌的方法,如下:
    @Test
    void 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 端口号就能避免这个错误了。

  • 15
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值