• FastDFS文件管理系统


    用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搭建文件系统并上传下载的过程。

    完!!!

     

  • 相关阅读:
    【总结】数组去重的3种方式
    【原】运动版的轮播图,有左右按钮和单独分页,原生JS版
    【巩固】JS中的封闭空间
    IIS 配置.svc的MIME映射
    c# 线程定时器 System.Threading.Timer 转载
    QTcreator快捷操作,转载
    C#中的钩子说明
    anaconda更新库命令
    Chart控件,chart、Series、ChartArea曲线图绘制的重要属性介绍
    c# chart控件柱状图,改变柱子宽度
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/7705158.html
Copyright © 2020-2023  润新知