用FastDFS一步步搭建文件管理系统
目录
- 一、FastDFS介绍
- 1、简介
- 2、FastDFS的存储策略
- 3、FastDFS的上传过程
- 4、FastDFS的文件同步
- 5、FastDFS的文件下载
- 二、安装FastDFS环境
- 0、前言
- 1、下载安装 libfastcommon
- 2、下载安装FastDFS
- 3、配置FastDFS跟踪器(Tracker)
- 4、配置 FastDFS 存储 (Storage)
- 5、文件上传测试
- 三、安装Nginx
- 1、安装nginx所需环境
- 2、安装Nginx
- 3、访问文件
- 四、FastDFS 配置 Nginx 模块
- 1、安装配置Nginx模块
- 五、Java客户端
- 1、首先需要搭建 FastDFS 客户端Java开发环境
- 2、客户端API
- 六、权限控制
回到顶部https://github.com/happyfish100
参考:分布式文件系统FastDFS设计原理
参考:FastDFS分布式文件系统
个人封装的FastDFS Java API:https://github.com/bojiangzhou/lyyzoo-fastdfs-java
回到顶部FastDFS 配置文件详解
① 进入 /etc/fdfs,复制 FastDFS 跟踪器样例配置文件 tracker.conf.sample,并重命名为 tracker.conf。
# cd /etc/fdfs # cp tracker.conf.sample tracker.conf # vim tracker.conf
② 编辑tracker.conf ,标红的需要修改下,其它的默认即可。
# 配置文件是否不生效,false 为生效 disabled=false
# 提供服务的端口 port=22122
# Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建) base_path=/ljzsg/fastdfs/tracker
# HTTP 服务端口 http.server_port=80
③ 创建tracker基础数据目录,即base_path对应的目录
# mkdir -p /ljzsg/fastdfs/tracker
④ 防火墙中打开跟踪端口(默认的22122)
# vim /etc/sysconfig/iptables
添加如下端口行: -A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT
重启防火墙: # service iptables restart
⑤ 启动Tracker
初次成功启动,会在 /ljzsg/fdfsdfs/tracker/ (配置的base_path)下创建 data、logs 两个目录。
可以用这种方式启动 # /etc/init.d/fdfs_trackerd start 也可以用这种方式启动,前提是上面创建了软链接,后面都用这种方式 # service fdfs_trackerd start
查看 FastDFS Tracker 是否已成功启动 ,22122端口正在被监听,则算是Tracker服务安装成功。
# netstat -unltp|grep fdfs
关闭Tracker命令:
# service fdfs_trackerd stop
⑥ 设置Tracker开机启动
# chkconfig fdfs_trackerd on
或者:
# vim /etc/rc.d/rc.local
加入配置:
/etc/init.d/fdfs_trackerd start
⑦ tracker server 目录及文件结构
Tracker服务启动成功后,会在base_path下创建data、logs两个目录。目录结构如下:
${base_path}
|__data
| |__storage_groups.dat:存储分组信息
| |__storage_servers.dat:存储服务器列表
|__logs
| |__trackerd.log: tracker server 日志文件
回到顶部回到顶部回到顶部https://github.com/bojiangzhou/lyyzoo-fastdfs-java.git
六、权限控制
前面使用nginx支持http方式访问文件,但所有人都能直接访问这个文件服务器了,所以做一下权限控制。
FastDFS的权限控制是在服务端开启token验证,客户端根据文件名、当前unix时间戳、秘钥获取token,在地址中带上token参数即可通过http方式访问文件。
① 服务端开启token验证
修改http.conf # vim /etc/fdfs/http.conf 设置为true表示开启token验证 http.anti_steal.check_token=true
设置token失效的时间单位为秒(s)
http.anti_steal.token_ttl=1800
密钥,跟客户端配置文件的fastdfs.http_secret_key保持一致 http.anti_steal.secret_key=FASTDFS1234567890 如果token检查失败,返回的页面 http.anti_steal.token_check_fail=/ljzsg/fastdfs/page/403.html
记得重启服务。
② 配置客户端
客户端只需要设置如下两个参数即可,两边的密钥保持一致。
# token 防盗链功能 fastdfs.http_anti_steal_token=true # 密钥 fastdfs.http_secret_key=FASTDFS1234567890
③ 客户端生成token
访问文件需要带上生成的token以及unix时间戳,所以返回的token是token和时间戳的拼接。
之后,将token拼接在地址后即可访问:file.ljzsg.com/group1/M00/00/00/wKgzgFnkaXqAIfXyAAEoRmXZPp878.jpeg?token=078d370098b03e9020b82c829c205e1f&ts=1508141521
1 /**
2 * 获取访问服务器的token,拼接到地址后面
3 *
4 * @param filepath 文件路径 group1/M00/00/00/wKgzgFnkTPyAIAUGAAEoRmXZPp876.jpeg
5 * @param httpSecretKey 密钥
6 * @return 返回token,如: token=078d370098b03e9020b82c829c205e1f&ts=1508141521
7 */
8 public static String getToken(String filepath, String httpSecretKey){
9 // unix seconds
10 int ts = (int) Instant.now().getEpochSecond();
11 // token
12 String token = "null";
13 try {
14 token = ProtoCommon.getToken(getFilename(filepath), ts, httpSecretKey);
15 } catch (UnsupportedEncodingException e) {
16 e.printStackTrace();
17 } catch (NoSuchAlgorithmException e) {
18 e.printStackTrace();
19 } catch (MyException e) {
20 e.printStackTrace();
21 }
22
23 StringBuilder sb = new StringBuilder();
24 sb.append("token=").append(token);
25 sb.append("&ts=").append(ts);
26
27 return sb.toString();
28 }
④ 注意事项
如果生成的token验证无法通过,请进行如下两项检查:
A. 确认调用token生成函数(ProtoCommon.getToken),传递的文件ID中没有包含group name。传递的文件ID格式形如:M00/00/00/wKgzgFnkTPyAIAUGAAEoRmXZPp876.jpeg
B. 确认服务器时间基本是一致的,注意服务器时间不能相差太多,不要相差到分钟级别。
⑤ 对比下发现,如果系统文件隐私性较高,可以直接通过fastdfs-client提供的API去访问即可,不用再配置Nginx走http访问。配置Nginx的主要目的是为了快速访问服务器的文件(如图片),如果还要加权限验证,则需要客户端生成token,其实已经没有多大意义。
关键是,这里我没找到FastDFS如何对部分资源加token验证,部分开放。有知道的还请留言。
OK,以上就是单机中使用FastDFS搭建文件系统并上传下载的过程。
完!!!