• 图床项目之FastDFS-Nginx fast-mod扩展模块原理


    一、架构

    proxy
    redirect
    storage
    nginx-module
    souece
    storage
    nginx-module
    storage
    nginx-module
    tracker集群

    在每台storage服务器主机上部署nginx及FastDFS,由nginx模块对storage存储的文件提供http下载服务,仅当当前storage节点找不到文件时会向源storage主机发起redirect或proxy动作。

    二、实现原理

    加载配置文件
    读取扩展模块配置
    是否从tracker加载配置
    读取自身配置,
    load_fdfs_parameters_from_tracker
    完成初始化
    获取tracker地址端口
    获取server配置

    2.1、加载配置文件

    目标文件在config的时候写死:/etc/fdfs/mod_fastdfs.conf 。

    2.2、读取扩展模块配置

    一些重要参数如下:

    group_count //group个数 
    url_have_group_name //url中是否包含group 
    group.store_path //group对应的存储路径 
    connect_timeout //连接超时 
    network_timeout //接收或发送超时 
    
    response_mode //响应模式,proxy或redirect 
    load_fdfs_parameters_from_tracker //是否从tracker下载服务端配置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.3、加载服务端配置

    根据load_fdfs_parameters_from_tracker参数确定是否从tracker获取server端的配置信息。
    (1)load_fdfs_parameters_from_tracker=true。

    1. 调用fdfs_load_tracker_group_ex解析tracker连接配置 ;
    2. 调用fdfs_get_ini_context_from_tracker连接tracker获取配置信息;
    3. 获取storage_sync_file_max_delay阈值
    4. 获取use_storage_id
    5. 如果use_storage_id为true,则连接tracker获取storage_ids映射表(fdfs_get_storage_ids_from_tracker_group)。

    (2)load_fdfs_parameters_from_tracker=false。

    1. 从mod_fastdfs.conf加载所需配置:storage_sync_file_max_delay、use_storage_id;
    2. 如果use_storage_id为true,则根据storage_ids_filename获取storage_ids映射表(fdfs_load_storage_ids_from_file)。

    三、下载过程

    解析访问路径
    反盗链检查
    读取文件元数据
    本地文件是否存在
    直接读取输出,sendfile方式
    客户端
    有效性检查
    处理模式
    重定向
    代理

    3.1、解析访问路径

    得到group和file_id_without_group两个参数。

    3.2、防盗链检查

    防盗链的应用场景,不希望文件被一直分享和下载,则可以在分享文件的时候加上token,其他人在没有token以及超过一定的时间后,无法下载该文件。
    (1)配置:
    在http.conf文件根据g_http_params.anti_steal_token配置,判断是否进行防盗链检查。
    (2)实现方式:
    采用token的方式实现防盗链,要求下载地址带上token,且token具有时效性(由ts参数指明)。
    (3)检查方式:私钥
    token=MD5(file_without_group+privateKey+ts);同时ts没有超过ttl范围。

    fdfs_http_shared.h

    fdfs_http_check_token(...);  //检验token的函数
    fdfs_http_gen_token(...);    //生成token的函数
    
    • 1
    • 2

    更多资源可以参考FastDFS的作者介绍的防盗链 使用FastDFS的内置防盗链功能

    3.3、获取文件元数据

    根据文件ID 获取元数据信息, 包括:源storage ip, 文件路径、名称,大小。
    由fdfs_get_file_info_ex1(…)函数实现。

    3.4、检查本地文件是否存在

    调用trunk_file_stat_ex1获取本地文件信息,该方法将实现:

    1. 辨别当前文件是trunkfile还是singlefile;
    2. 获得文件句柄fd;
    3. 如果文件是trunk形式则同时也将相关信息(偏移量/长度)一并获得。

    3.5、文件不存在的处理

    (1)进行有效性检查:

    1. 源storage是本机或者当前时间与文件创建时间的差距已经超过阈值,报错。
    2. 如果是redirect后的场景,同样报错。

    如果是由其他storage节点redirect过来的请求,其url参数中会存在redirect一项在通过有效性检查之后将进行代理或重定向处理。

    (2)重定向模式:
    配置项response_mode = redirect,此时服务端返回返回302响应码,url如下:

    http:// {源storage地址} : {当前port} {当前url} {参数"redirect=1"}(标记已重定向过)
    
    • 1

    重定向模式下要求源storage配备公开访问的webserver、同样的端口(一般是80)、同样的path配置。

    (3)代理模式:
    配置项response_mode = proxy,该模式的工作原理如同反向代理的做法,而仅仅使用源storage地址作为代理proxy的host,其余部分保持不变。

    (4)重定向和代理的区别:

    重定向:客户端访问某个服务器的资源,然而该服务器没有所请求的资源,但是该服务器检测到集群中的另一台服务器有客户端所请求的资源,因此返回相关的另一台服务器信息给客户端,客户端再重新请求重定向的服务器。
    redirect

    代理:客户端访问某个服务器的资源,然而该服务器没有所请求的资源,但是该服务器检测到集群中的另一台服务器有客户端所请求的资源,因此该服务器转发请求到另一台服务器获取相关数据,然后再发结果给客户端。

    proxy
    优缺点:

    模式优点缺点
    代理只需要验证一次token当很多请求都需要转发到另一条服务器,那么将会占用该服务器的带宽,影响效率
    重定向不会把资源集中在某一台服务器两次请求,需要验证token两次

    3.6、输出本地文件

    当本地文件存在时,将直接输出。
    (1)根据是否trunkfile获取文件名,文件名长度、文件offset。
    (2)若nginx开启了send_file开关而且当前为非chunkFile的情况下尝试使用sendfile方法以优化性能。
    (3)否则使用lseek 方式随机访问文件,并输出相应的段。做法是使用chunk方式循环读,输出。
    在这里插入图片描述

  • 相关阅读:
    请求与响应:响应
    温馨提示:不注意这几点,PDT(产品开发团队)就得散!
    基于ssm的美妆购物平台管理系统(idea+spring+springmvc+mybatis+jsp)
    [附源码]计算机毕业设计springboot学生在线考试系统
    M语言-模式匹配
    单边循环的快排
    Android---GC回收机制与分代回收策略
    GGTalk 开源即时通讯系统源码剖析之:聊天消息防错漏机制
    [汇编语言][bx]和loop指令
    TensorFlow新文档发布:新增CLP、DTensor...最先进的模型已就绪
  • 原文地址:https://blog.csdn.net/Long_xu/article/details/127848631