简单的测试访问文件

① 修改nginx.conf

复制代码
  1. # vim /usr/local/nginx/conf/nginx.conf
  2.  
  3. 添加如下行,将 /group1/M00 映射到 /ljzsg/fastdfs/file/data
  4. location /group1/M00 {
  5. alias /ljzsg/fastdfs/file/data;
  6. }

    # 重启nginx
    # /usr/local/nginx/sbin/nginx -s reload
复制代码

② 在浏览器访问之前上传的图片、成功。

http://file.ljzsg.com/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

 

① 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、解压

复制代码
  1. # 这里为啥这么长一串呢,因为最新版的master与当前nginx有些版本问题。
  2. # wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
  3.  
  4. # 解压
  5. # unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
  6.  
  7. # 重命名
  8. # mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module-master
复制代码

③ 配置Nginx

在nginx中添加模块

复制代码
  1. # 先停掉nginx服务
    # /usr/local/nginx/sbin/ngix -s stop

    进入解压包目录
  2. # cd /softpackages/nginx-1.12.1/
  3.  
  4. # 添加模块
  5. # ./configure --add-module=../fastdfs-nginx-module-master/src
  6.  
  7. 重新编译、安装
  8. # make && make install
复制代码

 ④ 查看Nginx的模块

  1. # /usr/local/nginx/sbin/nginx -V

有下面这个就说明添加模块成功

⑤ 复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录, 并修改

  1. # cd /softpackages/fastdfs-nginx-module-master/src

    # cp mod_fastdfs.conf /etc/fdfs/

修改如下配置,其它默认

复制代码
  1. # 连接超时时间
    connect_timeout=10
  2.  
  3. # Tracker Server
  4. tracker_server=file.ljzsg.com:22122

  5. # StorageServer 默认端口
  6. storage_server_port=23000
  7.  
  8. # 如果文件ID的uri中包含/group**,则要设置为true
  9. url_have_group_name = true
  10.  
  11. # Storage 配置的store_path0路径,必须和storage.conf中的一致
  12. store_path0=/ljzsg/fastdfs/file
复制代码

⑥ 复制 FastDFS 的部分配置文件到/etc/fdfs 目录

  1. # cd /softpackages/fastdfs-5.05/conf/
  2.  
  3. # cp anti-steal.jpg http.conf mime.types /etc/fdfs/

 ⑦ 配置nginx,修改nginx.conf

  1. # vim /usr/local/nginx/conf/nginx.conf

修改配置,其它的默认

在80端口下添加fastdfs-nginx模块

  1. location ~/group([0-9])/M00 {
  2. ngx_fastdfs_module;
  3. }

注意:

  listen 80 端口值是要与 /etc/fdfs/storage.conf 中的 http.server_port=80 (前面改成80了)相对应。如果改成其它端口,则需要统一,同时在防火墙中打开该端口。

  location 的配置,如果有多个group则配置location ~/group([0-9])/M00 ,没有则不用配group。

⑧ 在/ljzsg/fastdfs/file 文件存储目录下创建软连接,将其链接到实际存放数据的目录,这一步可以省略。

  1. # ln -s /ljzsg/fastdfs/file/data/ /ljzsg/fastdfs/file/data/M00

⑨ 启动nginx

  1. # /usr/local/nginx/sbin/nginx

打印处如下就算配置成功

⑩ 在地址栏访问。

能下载文件就算安装成功。注意和第三点中直接使用nginx路由访问不同的是,这里配置 fastdfs-nginx-module 模块,可以重定向文件链接到源服务器取文件。

http://file.ljzsg.com/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

 

最终部署结构图(盗的图):可以按照下面的结构搭建环境。

 

前面文件系统平台搭建好了,现在就要写客户端代码在系统中实现上传下载,这里只是简单的测试代码。

① 项目中使用maven进行依赖管理,可以在pom.xml中引入如下依赖即可:

  1. <dependency>
  2. <groupId>net.oschina.zcx7878</groupId>
  3. <artifactId>fastdfs-client-java</artifactId>
  4. <version>1.27.0.0</version>
  5. </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。只需要加载这个配置文件即可

个人封装的FastDFS Java API以同步到github:https://github.com/bojiangzhou/lyyzoo-fastdfs-java.git

 

前面使用nginx支持http方式访问文件,但所有人都能直接访问这个文件服务器了,所以做一下权限控制。

FastDFS的权限控制是在服务端开启token验证,客户端根据文件名、当前unix时间戳、秘钥获取token,在地址中带上token参数即可通过http方式访问文件。

① 服务端开启token验证

复制代码
  1. 修改http.conf
  2. # vim /etc/fdfs/http.conf
  3.  
  4. 设置为true表示开启token验证
  5. http.anti_steal.check_token=true

    设置token失效的时间单位为秒(s)
    http.anti_steal.token_ttl=1800
  6. 密钥,跟客户端配置文件的fastdfs.http_secret_key保持一致
  7. http.anti_steal.secret_key=FASTDFS1234567890
  8.  
  9. 如果token检查失败,返回的页面
  10. http.anti_steal.token_check_fail=/ljzsg/fastdfs/page/403.html
复制代码

记得重启服务。

② 配置客户端

客户端只需要设置如下两个参数即可,两边的密钥保持一致。

  1. # token 防盗链功能
  2. fastdfs.http_anti_steal_token=true
  3. # 密钥
  4. 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. 1 /**
  2. 2 * 获取访问服务器的token,拼接到地址后面
  3. 3 *
  4. 4 * @param filepath 文件路径 group1/M00/00/00/wKgzgFnkTPyAIAUGAAEoRmXZPp876.jpeg
  5. 5 * @param httpSecretKey 密钥
  6. 6 * @return 返回token,如: token=078d370098b03e9020b82c829c205e1f&ts=1508141521
  7. 7 */
  8. 8 public static String getToken(String filepath, String httpSecretKey){
  9. 9 // unix seconds
  10. 10 int ts = (int) Instant.now().getEpochSecond();
  11. 11 // token
  12. 12 String token = "null";
  13. 13 try {
  14. 14 token = ProtoCommon.getToken(getFilename(filepath), ts, httpSecretKey);
  15. 15 } catch (UnsupportedEncodingException e) {
  16. 16 e.printStackTrace();
  17. 17 } catch (NoSuchAlgorithmException e) {
  18. 18 e.printStackTrace();
  19. 19 } catch (MyException e) {
  20. 20 e.printStackTrace();
  21. 21 }
  22. 22
  23. 23 StringBuilder sb = new StringBuilder();
  24. 24 sb.append("token=").append(token);
  25. 25 sb.append("&ts=").append(ts);
  26. 26
  27. 27 return sb.toString();
  28. 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搭建文件系统并上传下载的过程。

完!!!

 

posted on
2017-10-21 16:40 
HackerVirus 
阅读(14404
评论(3
编辑 
收藏 
举报

版权声明:本文为Leo_wl原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Leo_wl/p/7705158.html