FastDFS 的安装、使用、踩坑过程
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】
- 首先下载 Nginx
wget http://nginx.org/download/nginx-1.17.0.tar.gz
- 然后解压下载的目录,进入解压目录中,在编译安装之前,需要安装两个依赖:
yum -y install pcre-devel
yum -y install openssl openssl-devel
- 然后开始编译安装
./configure
make
make install
- 装好之后,默认安装位置在:
/usr/local/nginx/sbin/nginx
- 进入到该目录的 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 端口号就能避免这个错误了。
上一篇: C语言进阶教程之数组指针和指针数组分析
下一篇: Qt入门 OpenGL应用(二)