目前项目(springboot)中使用的文件及图片较多,决定自己搭建一个文件服务器用来存储文件,经过参考多个文章搭建成功,遂写下此教程分享给大家:
Linux系统:Centos 6.5
FastDFS开源地址:
https://github.com/happyfish100
,下载最新的:fastdfs-master、libfastcommon-master、fastdfs-nginx-module-master,避免版本问题
-
一、FastDFS 简介及系统环境搭建
-
二、FastDFS 配置Nginx模块及访问测试
-
三、FastDFS 通过java上传文件
一、FastDFS简介及系统环境搭建
1、简介
FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。
Tracker Server
:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
Storage Server
:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
Client
:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
2、系统环境搭建
上传相关包到/opt/soft_jar/fastdfs下并解压,如图:
下载zip解压工具:
解压三个包到/opt/soft下:
unzip -o fastdfs-master.zip -d /opt/soft
unzip -o libfastcommon-master.zip -d /opt/soft
unzip -o fastdfs-nginx-module-master.zip -d /opt/soft
安装perl:
安装gcc:
安装libfastcommon:
cd /opt/soft/libfastcommon-master
./make.sh
./make.sh install
安装fast:
cd /opt/soft/fastdfs-master
./make.sh
拷贝配置文件:
将fastdfs安装目录下的 conf 下的文件拷贝到/etc/fdfs/下
至此,fastdfs已经安装完毕,接下来配置trackerd和storaged并启动。
配置并启动trackerd
修改trackerd.conf
不改也可以,但是要保证/home/yuqing/fastdfs路径存在
cd /etc/fdfs/
vim tracker.conf
base_path=/home/yuqing/fastdfs 改为:base_path=/data/fastdfs
创建trackerd数据、日志目录
启动trackerd
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
查看trackerd进程,如下图:
说明trackered已经启动起来;其实也可以查看日志:/data/fastdfs/logs/trackerd.log,来判断trackerd是否正常启动起来。
配置并启动storaged
修改storage.conf
cd /etc/fdfs/
vim storage.conf
base_path=/home/yuqing/fastdfs 改为:base_path=/data/fastdfs
store_path0=/home/yuqing/fastdfs 改为:store_path0=/data/fastdfs/storage
tracker_server=192.168.209.121:22122 改为:tracker_server=192.168.174.104,这个ip改成自己的
创建storaged数据、日志目录
mkdir -p /data/fastdfs/storage
启动storaged
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
查看storaged进程,如下图:
说明storaged已经启动起来;其实也可以查看日志:/data/fastdfs/logs/storaged.log来判断storaged是否正常启动起来。
查看Storage和Tracker是否在通信:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
设置开机启动:(可以不配置,文末附启动所有程序的脚本文件)
chkconfig fdfs_trackerd on
chkconfig fdfs_storaged on
文件上传测试:
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf 123.jpeg
上传成功后返回文件ID号:group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg
也可以进入/data/fastdfs/storage/data/00/00 目录下查看。
返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
至此,fastdfs文件服务器已经搭建成功。由于现在还没有和nginx整合无法使用http查看,接下来我们来安装配置nginx~
二、FastDFS 配置Nginx模块及访问测试
1、fastdfs-nginx-module安装
前面已经解压过相关压缩包。
拷贝配置文件
cd /usr/local/fastdfs-nginx-module-master/src
cp mod_fastdfs.conf /etc/fdfs/
编辑配置文件
cd /etc/fdfs/
vi mod_fastdfs.conf
base_path=/tmp 改为:base_path=/data/fastdfs
tracker_server=tracker:22122 改为:tracker_server=192.168.174.104:22122
url_have_group_name = false 改为:url_have_group_name = true;#url中包含group名称
store_path0=/home/yuqing/fastdfs 改为:store_path0=/data/fastdfs/storage
2、nginx安装
nginx依赖包安装
cd /opt
yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
解压 nginx-1.13.12.tar.gz到 /opt/soft
tar -zxvf nginx-1.13.12.tar.gz -C /opt/soft
安装nginx并添加fastdfs模块
cd nginx-1.13.12
./configure --prefix=/opt/soft/nginx --add-module=/usr/local/fastdfs-nginx-module-master/src
make && make install
检查nginx模块
cd /opt/soft/nginx/sbin
./nginx -V
已经把fastdfs模块添加进去了。
配置nginx配置文件
cd /opt/soft/nginx/conf
vim nginx-fdfs.conf
内容如下,server_name注意改成自己的ip:
启动nginx
cd /opt/soft/nginx/sbin/
./nginx -c /opt/soft/nginx/conf/nginx-fdfs.conf
访问图片
文件路径在上面的上传图片的测试代码中有输入,我们进行拼装下:
http://你的IP/group1/M00/00/00/rB4HZF1fA6OAZ1veAAI8OyLpMuI751.jpeg
至此,与nginx整合完成,接下来通过java代码上传文
三、FastDFS 通过java上传文件
在项目(springboot)中使用fastdfs+nginx+mysql实现上传附件的功能,主要原理就是将文件上传到fastdfs服务器得到一个文件的链接路径url,我们获取到这个url,保存到我们的mysql中。
1、添加依赖
<!-- fastdfs -->
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- 工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.10</version>
</dependency>
由于fastdfs-client-java下载不下来,我们需要下载源码进行maven编译成jar包,手动添加到项目中。(过程不再赘述,不会的自行百度,或者私聊我打包好的jar包)
2、添加配置文件 fdfs_client.conf
connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8080
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = 自己的ip:22122
3、具体实现代码
/**
* 上传文件到FastDFS
* @param file
public static ResultInfo fastDFSUpload(MultipartFile file) {
String ext_Name = file.getOriginalFilename().split("\\.")[1];
String file_Name = file.getOriginalFilename().split("\\.")[0];
long file_size = file.getSize();
byte[] bytes = null;
try {
bytes = file.getBytes();
} catch (IOException e) {
e.printStackTrace();
String filePath= uploadFile(bytes, ext_Name, file_Name);
FileQuery fileQuery = new FileQuery();
fileQuery.setFilePath(filePath);
fileQuery.setFileName(file_Name);
fileQuery.setFileSize(file_size);
return success(ResultConstants.DM_SUCCESS_CODE, "文件上传成功", fileQuery);
* FastDFS实现文件下载
* @param filePath
public static ResultInfo fastDFSDownload(String filePath) {
String fileName="";
try {
ClientGlobal.init("fdfs_client.conf");
// 链接FastDFS服务器,创建tracker和Stroage
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
String storageServerIp = getStorageServerIp(trackerClient, trackerServer);
StorageServer storageServer = getStorageServer(storageServerIp);
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
byte[] b = storageClient.download_file("group1", filePath);
if (b == null) {
throw new IOException("文件" + filePath + "不存在");
fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
FileOutputStream fileOutputStream = new FileOutputStream("D:/Desktop/fastdfs//" + fileName);
IOUtils.write(b, fileOutputStream);
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
return success(ResultConstants.DM_SUCCESS_CODE, "文件下载成功", "D:/Desktop/fastdfs//" + fileName);
* FastDFS获取将上传文件信息
public static ResultInfo fastDFSGetFileInfo(String filePath) {
FileInfo fi = null;
try {
// 链接FastDFS服务器,创建tracker和Stroage
ClientGlobal.init("fdfs_client.conf");
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
String storageServerIp = getStorageServerIp(trackerClient, trackerServer);
StorageServer storageServer = getStorageServer(storageServerIp);
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
fi = storageClient.get_file_info("group1", filePath);
if (fi == null) {
throw new IOException("文件" + filePath + "不存在");
log.debug("文件信息=" + fi.toString());
} catch (Exception e) {
e.printStackTrace();
return success(ResultConstants.DM_SUCCESS_CODE, "获取将上传文件信息成功", fi.toString());
* FastDFS实现删除文件
public static ResultInfo fastDFSDelete(String filePath) {
try {
// 链接FastDFS服务器,创建tracker和Stroage
ClientGlobal.init("fdfs_client.conf");
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
String storageServerIp = getStorageServerIp(trackerClient, trackerServer);
StorageServer storageServer = getStorageServer(storageServerIp);
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
int i = storageClient.delete_file("group1", filePath);
log.debug(i == 0 ? "删除成功" : "删除失败:" + i);
} catch (Exception e) {
e.printStackTrace();
return ResultInfo.success(ResultConstants.DM_SUCCESS_CODE, "删除文件成功");
public static String uploadFile(byte[] byteFile, String ext_file, String file_Name) {
// 拼接服务区的文件路径
StringBuffer sbPath = new StringBuffer();
sbPath.append("http://自己的ip:8090/");
try {
ClientGlobal.init("fdfs_client.conf");
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
//利用字节流上传文件
NameValuePair[] nvps = new NameValuePair[1];
nvps[0] = new NameValuePair(file_Name, ext_file);
String[] strings = storageClient.upload_file(byteFile, ext_file, null);
sbPath.append(StrUtil.join("/", strings));
log.info("上传路径=" + sbPath.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
return sbPath.toString();
}
也可以封装成工具类直接使用,至此,所有工作已经完成!
总结
搭建过程中只要细心,按照教程一步一步来就不会出什么错;
在此特别感谢提供参考的博主。
附录
一键启动FastDFS和nginx脚本
#!/bin/sh
echo 启动storage
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
echo 启动tracker
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
echo 启动nginx
cd /opt/soft/nginx/sbin/
./nginx -c /opt/soft/nginx/conf/nginx-fdfs.conf
echo 查看fdfs、nginx进程...
ps -ef|grep fdfs
echo fastdfs系统启动完毕!
cd /opt/soft