欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-28 11:46:21
...

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

修改如下配置:
FastDFS 的安装、使用、踩坑过程

默认端口是 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

FastDFS 的安装、使用、踩坑过程
FastDFS 的安装、使用、踩坑过程
这里一共配置了三个地方,分别是 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 方法上传文件,第一个参数是文件路径,第二个参数是文件的扩展名,第三个参数是文件的元数据信息,这个方法的返回值,就是上传文件的访问路径,执行该方法,打印日志如下:
    FastDFS 的安装、使用、踩坑过程

  • 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

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

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

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

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

全部安装成功了。

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

  • 由于上面我们已经完成了文件上传的功能,并且拿到了文件Id,也就是如下图所示:
    FastDFS 的安装、使用、踩坑过程
  • 此时在浏览器中输入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

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

  • 配置完成后,重启服务器:
./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 端口号就能避免这个错误了。

相关标签: 个人笔记