自大学期间搭建FastDFS已有两年之久,回头看原有的文档,图片都丢了,也算是CSDN的老传统了。国庆期间在家又重新搭建了一次,比较简单,全程用时3H,部分敏感信息已打码但不影响实操,希望对大家有所帮助。
此次我的服务器进行了一次重装,如果你的电脑已经具备GCC,YUM环境请从第三节开始。一般大家的都具备。
目录
文件整体目录结构如下图,所有资源下载链接:GitHub,CSDN(优先这个,全一些,GitHub大于25M的上传不了)
1.安装YUM
-
yum资源包
- 对应Github里面的yum
-
执行安装指令
-
解压yum资源包
-
- 执行上述红框之中的指令,进入到指定的文件路径下,执行下述指令
./configure --enable-checking=release --enable-languages=c,c++,disable-multilib
rpm -ivh python-iniparse-0.3.1-2.1.el6.noarch.rpm
rpm -ivh yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
rpm -ivh yum-3.2.29-81.el6.centos.noarch.rpm
rpm -ivh yum-plugin-fastestmirror-1.1.30-41.el6.noarch.rpm
- 验证一下,如下图即成功
2.安装GCC
-
首先查看对应当前Liunx的Glibc版本,我的是在安装时候提示的需要2.14
-
也可通过指令查看支持最高版本
strings /lib64/libc.so.6 | grep GLIBC
- 指令结果如图
- 拿出所有glibc里面的文件
-
执行安装指令(我在这新建了一个glibc文件夹存放所有rpm)
- 执行安装指令
rpm -ivh *.rpm --nodeps --force
- 部分没有100%不影响
-
安装gcc离线版【对应Github里面的:gcc离线安装包文件夹】(我是新建一个和glibc平行的文件夹gcc_local)
-
注意:删除里面原有的glibc文件,一共两个
-
执行安装指令
- 验证
以上完成GCC,YUM环境离线版本安装,在线版本更简单,大家可以自行百度
3.安装FastDFS
我们需要使用的四个核心文件:
3.1 安装libfastcommon
-
解压libfastcommon并进入
-
执行 ./make.sh 指令
- 执行 ./make.sh install
3.2 安装fastdfs-master
- 返回 /etc 路径,创建文件夹,返回到fastdfs路径并拷贝配置文件
- 修改tracker.conf storeage.conf和client.conf配置,是 /etc/fastdfs/下面的
- 创建对应的文件夹
- 修改storage.conf 三个地方
1.日志存放
2.文件存放
3.tracker IP:对应文件服务器地址,端口对应上面tracker.conf中的端口
- 修改client.conf两个地方,基本同上
3.3 安装fastdfs-nginx-module
- 修改mod_fastdfs.conf,在解压文件src中
- storage要创建对应的文件夹,方法路径同上面tracker一致
-
复制mod_fastdfs.conf到前面的 /etc/fastdfs路径下
4.配置Nginx
- 配置nginx的conf文件,添加一组server
5.启动服务并修复错误
- 启动tarcker,storage,报错
- 错误出现原因:未能绑定最新依赖,更新依赖即可
- 涉及指令
ldd /usr/bin/fdfs_trackerd
ll /usr/local/lib/libfastcommon.so
ll /usr/lib/libfastcommon.so
rm -rf /usr/lib/libfastcommon.so
ldd /usr/bin/fdfs
ldd /usr/bin/fdfs_trackerd
/sbin/ldconfig
tracker启动
/usr/bin/fdfs_trackerd /etc/fastdfs/tracker.conf
storage启动
/usr/bin/fdfs_storaged /etc/fastdfs/storage.conf
6.验证代码示例
/**
* 上传附件到文件服务器
* @param file 附件
* @param confFileName 配置文件
* @return 文件名称/group/具体路径
*/
public static String upload(MultipartFile file, String confFileName) {
try {
String fileName = file.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf(".")+1);
ClientGlobal.init(confFileName);
// 创建TrackerClient对象
TrackerClient trackerClient = new TrackerClient();
// 创建TrackerServer对象
TrackerServer trackerServer = trackerClient.getConnection();
// 声明一个StorageServer对象,null
StorageServer storageServer = null;
// 获得StorageClient对象
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 调用StorageClient对象上传文件
String[] strings = storageClient.upload_file(file.getBytes(), suffix, null);
String url = "";
for (String str : strings) {
url += str + "/";
}
// 返回格式:文件名称/group/具体路径
url = fileName + "/" + url.substring(0,url.lastIndexOf("/"));
return url;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 附件下载
* @param fileName 文件名称
* @param confFileName 配置文件
* @return
*/
public static byte[] download(String fileName, String confFileName)
{
try
{
ClientGlobal.init(confFileName);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
// 截取 Activiti.bmp/group1/M00/00/00/CgSRYl1Sl4-APEogABIW_tEAGGc078.bmp
String file_name = fileName.substring(fileName.indexOf("/")+1);
String group_name = file_name.substring(0, file_name.indexOf("/"));
String remote_file = file_name.substring(file_name.indexOf("/")+1);
byte[] b = storageClient.download_file(group_name,remote_file);
return b;
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}
- 配置文件每个人都不一样,我的是如下:
connect_timeout = 2 network_timeout = 30 charset = UTF-8 http.tracker_http_port = 80 http.anti_steal_token = no http_secret_key = test20191006 tracker_server = 10.X.X.X:22122