FastDFS-Nginx fast-mod扩展模块

  • 一、架构
  • 二、实现原理
  • 2.1、加载配置文件
  • 2.2、读取扩展模块配置
  • 2.3、加载服务端配置
  • 三、下载过程
  • 3.1、解析访问路径
  • 3.2、防盗链检查
  • 3.3、获取文件元数据
  • 3.4、检查本地文件是否存在
  • 3.5、文件不存在的处理
  • 3.6、输出本地文件


一、架构


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下载服务端配置

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的函数

更多资源可以参考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"}(标记已重定向过)

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

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

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

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

nginx图形界面配置 nginx图床_后端

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

nginx图形界面配置 nginx图床_nginx_02


优缺点:

模式

优点

缺点

代理

只需要验证一次token

当很多请求都需要转发到另一条服务器,那么将会占用该服务器的带宽,影响效率

重定向

不会把资源集中在某一台服务器

两次请求,需要验证token两次

3.6、输出本地文件

当本地文件存在时,将直接输出。

(1)根据是否trunkfile获取文件名,文件名长度、文件offset。

(2)若nginx开启了send_file开关而且当前为非chunkFile的情况下尝试使用sendfile方法以优化性能。

(3)否则使用lseek 方式随机访问文件,并输出相应的段。做法是使用chunk方式循环读,输出。