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。
- 调用fdfs_load_tracker_group_ex解析tracker连接配置 ;
- 调用fdfs_get_ini_context_from_tracker连接tracker获取配置信息;
- 获取storage_sync_file_max_delay阈值
- 获取use_storage_id
- 如果use_storage_id为true,则连接tracker获取storage_ids映射表(fdfs_get_storage_ids_from_tracker_group)。
(2)load_fdfs_parameters_from_tracker=false。
- 从mod_fastdfs.conf加载所需配置:storage_sync_file_max_delay、use_storage_id;
- 如果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获取本地文件信息,该方法将实现:
- 辨别当前文件是trunkfile还是singlefile;
- 获得文件句柄fd;
- 如果文件是trunk形式则同时也将相关信息(偏移量/长度)一并获得。
3.5、文件不存在的处理
(1)进行有效性检查:
- 源storage是本机或者当前时间与文件创建时间的差距已经超过阈值,报错。
- 如果是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)重定向和代理的区别:
重定向:客户端访问某个服务器的资源,然而该服务器没有所请求的资源,但是该服务器检测到集群中的另一台服务器有客户端所请求的资源,因此返回相关的另一台服务器信息给客户端,客户端再重新请求重定向的服务器。
代理:客户端访问某个服务器的资源,然而该服务器没有所请求的资源,但是该服务器检测到集群中的另一台服务器有客户端所请求的资源,因此该服务器转发请求到另一台服务器获取相关数据,然后再发结果给客户端。
优缺点:
模式 | 优点 | 缺点 |
代理 | 只需要验证一次token | 当很多请求都需要转发到另一条服务器,那么将会占用该服务器的带宽,影响效率 |
重定向 | 不会把资源集中在某一台服务器 | 两次请求,需要验证token两次 |
3.6、输出本地文件
当本地文件存在时,将直接输出。
(1)根据是否trunkfile获取文件名,文件名长度、文件offset。
(2)若nginx开启了send_file开关而且当前为非chunkFile的情况下尝试使用sendfile方法以优化性能。
(3)否则使用lseek 方式随机访问文件,并输出相应的段。做法是使用chunk方式循环读,输出。