用FastDFS一步步搭建文件管理系统
3、访问文件
简单的测试访问文件
① 修改nginx.conf
# vim /usr/local/nginx/conf/nginx.conf 添加如下行,将 /group1/M00 映射到 /ljzsg/fastdfs/file/data location /group1/M00 { alias /ljzsg/fastdfs/file/data; }
# 重启nginx
# /usr/local/nginx/sbin/nginx -s reload
② 在浏览器访问之前上传的图片、成功。
http://file.ljzsg.com/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg
四、FastDFS 配置 Nginx 模块
1、安装配置Nginx模块
① fastdfs-nginx-module 模块说明
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进行文件复制, 有同步延迟的问题。
假设 Tracker 服务器将文件上传到了 192.168.51.128,上传成功后文件 ID已经返回给客户端。
此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.51.129,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.51.129 上取文件,就会出现文件无法访问的错误。
而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
② 下载 fastdfs-nginx-module、解压
# 这里为啥这么长一串呢,因为最新版的master与当前nginx有些版本问题。 # wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip # 解压 # unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip # 重命名 # mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module-master
③ 配置Nginx
在nginx中添加模块
# 先停掉nginx服务
# /usr/local/nginx/sbin/ngix -s stop
进入解压包目录 # cd /softpackages/nginx-1.12.1/ # 添加模块 # ./configure --add-module=../fastdfs-nginx-module-master/src 重新编译、安装 # make && make install
④ 查看Nginx的模块
# /usr/local/nginx/sbin/nginx -V
有下面这个就说明添加模块成功
⑤ 复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录, 并修改
# cd /softpackages/fastdfs-nginx-module-master/src
# cp mod_fastdfs.conf /etc/fdfs/
修改如下配置,其它默认
# 连接超时时间
connect_timeout=10 # Tracker Server tracker_server=file.ljzsg.com:22122
# StorageServer 默认端口 storage_server_port=23000 # 如果文件ID的uri中包含/group**,则要设置为true url_have_group_name = true # Storage 配置的store_path0路径,必须和storage.conf中的一致 store_path0=/ljzsg/fastdfs/file
⑥ 复制 FastDFS 的部分配置文件到/etc/fdfs 目录
# cd /softpackages/fastdfs-5.05/conf/ # cp anti-steal.jpg http.conf mime.types /etc/fdfs/
⑦ 配置nginx,修改nginx.conf
# vim /usr/local/nginx/conf/nginx.conf
修改配置,其它的默认
在80端口下添加fastdfs-nginx模块
location ~/group([0-9])/M00 { ngx_fastdfs_module; }
注意:
listen 80 端口值是要与 /etc/fdfs/storage.conf 中的 http.server_port=80 (前面改成80了)相对应。如果改成其它端口,则需要统一,同时在防火墙中打开该端口。
location 的配置,如果有多个group则配置location ~/group([0-9])/M00 ,没有则不用配group。
⑧ 在/ljzsg/fastdfs/file 文件存储目录下创建软连接,将其链接到实际存放数据的目录,这一步可以省略。
# ln -s /ljzsg/fastdfs/file/data/ /ljzsg/fastdfs/file/data/M00
⑨ 启动nginx
# /usr/local/nginx/sbin/nginx
打印处如下就算配置成功
⑩ 在地址栏访问。
能下载文件就算安装成功。注意和第三点中直接使用nginx路由访问不同的是,这里配置 fastdfs-nginx-module 模块,可以重定向文件链接到源服务器取文件。
http://file.ljzsg.com/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg
最终部署结构图(盗的图):可以按照下面的结构搭建环境。
五、Java客户端
前面文件系统平台搭建好了,现在就要写客户端代码在系统中实现上传下载,这里只是简单的测试代码。
1、首先需要搭建 FastDFS 客户端Java开发环境
① 项目中使用maven进行依赖管理,可以在pom.xml中引入如下依赖即可:
<dependency> <groupId>net.oschina.zcx7878</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.27.0.0</version> </dependency>
其它的方式,参考官方文档:https://github.com/happyfish100/fastdfs-client-java
② 引入配置文件
可直接复制包下的 fastdfs-client.properties.sample 或者 fdfs_client.conf.sample,到你的项目中,去掉.sample。
我这里直接复制 fastdfs-client.properties.sample 中的配置到项目配置文件 config.properties 中,修改tracker_servers。只需要加载这个配置文件即可
2、客户端API
个人封装的FastDFS Java API以同步到github: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搭建文件系统并上传下载的过程。
完!!!