/**
* Copyright (C) 2008 Happy Fish / YuQing
*
* FastDFS may be copied only under the terms of the GNU General
* Public License V3, which may be found in the FastDFS source kit.
* Please visit the FastDFS Home Page http://www.fastken.com/ for more detail.
**/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <limits.h>
#include <time.h>
#include <unistd.h>
#include "fastcommon/logger.h"
#include "fastcommon/shared_func.h"
#include "fastcommon/sockopt.h"
#include "fastcommon/http_func.h"
#include "fastcommon/local_ip_func.h"
#include "fastdfs/fdfs_define.h"
#include "fastdfs/fdfs_global.h"
#include "fastdfs/fdfs_http_shared.h"
#include "fastdfs/fdfs_client.h"
#include "fastdfs/fdfs_shared_func.h"
#include "fastdfs/trunk_shared.h"
#include "common.h"
#define FDFS_MOD_REPONSE_MODE_PROXY 'P'
#define FDFS_MOD_REPONSE_MODE_REDIRECT 'R'
#define FDFS_CONTENT_TYPE_TAG_STR "Content-type: "
#define FDFS_CONTENT_TYPE_TAG_LEN (sizeof(FDFS_CONTENT_TYPE_TAG_STR) - 1)
#define FDFS_CONTENT_RANGE_TAG_STR "Content-range: "
#define FDFS_CONTENT_RANGE_TAG_LEN (sizeof(FDFS_CONTENT_RANGE_TAG_STR) - 1)
static char flv_header[] = "FLV\x1\x1\0\0\0\x9\0\0\0\x9";
#define FDFS_RANGE_LENGTH(range) ((range.end - range.start) + 1)
typedef struct tagGroupStorePaths {
char group_name[FDFS_GROUP_NAME_MAX_LEN + 1];
int group_name_len;
int storage_server_port;
FDFSStorePaths store_paths;
} GroupStorePaths;
static int storage_server_port = FDFS_STORAGE_SERVER_DEF_PORT;
static int my_group_name_len = 0;
static int group_count = 0; //for multi groups
static bool url_have_group_name = false;
static bool use_storage_id = false;
static bool flv_support = false; //if support flv
static char flv_extension[FDFS_FILE_EXT_NAME_MAX_LEN + 1] = {0}; //flv extension name
static int flv_ext_len = 0; //flv extension length
static char my_group_name[FDFS_GROUP_NAME_MAX_LEN + 1] = {0};
static char response_mode = FDFS_MOD_REPONSE_MODE_PROXY;
static GroupStorePaths *group_store_paths = NULL; //for multi groups
static FDFSHTTPParams g_http_params;
static int storage_sync_file_max_delay = 24 * 3600;
static int fdfs_get_params_from_tracker();
static int fdfs_format_http_datetime(time_t t, char *buff, const int buff_size);
static int fdfs_strtoll(const char *s, int64_t *value)
{
char *end = NULL;
*value = strtoll(s, &end, 10);
if (end != NULL && *end != '\0')
{
return EINVAL;
}
return 0;
}
static int fdfs_load_groups_store_paths(IniContext *pItemContext)
{
char section_name[64];
char *pGroupName;
int bytes;
int result;
int i;
bytes = sizeof(GroupStorePaths) * group_count;
group_store_paths = (GroupStorePaths *)malloc(bytes);
if (group_store_paths == NULL)
{
logError("file: "__FILE__", line: %d, " \
"malloc %d bytes fail, " \
"errno: %d, error info: %s", \
__LINE__, bytes, errno, STRERROR(errno));
return errno != 0 ? errno : ENOMEM;
}
for (i=0; i<group_count; i++)
{
sprintf(section_name, "group%d", i + 1);
pGroupName = iniGetStrValue(section_name, "group_name", \
pItemContext);
if (pGroupName == NULL)
{
logError("file: "__FILE__", line: %d, " \
"section: %s, you must set parameter: " \
"group_name!", __LINE__, section_name);
return ENOENT;
}
group_store_paths[i].storage_server_port = iniGetIntValue( \
section_name, "storage_server_port", pItemContext, \
FDFS_STORAGE_SERVER_DEF_PORT);
group_store_paths[i].group_name_len = snprintf( \
group_store_paths[i].group_name, \
sizeof(group_store_paths[i].group_name), \
"%s", pGroupName);
if (group_store_paths[i].group_name_len == 0)
{
logError("file: "__FILE__", line: %d, " \
"section: %s, parameter: group_name " \
"can't be empty!", __LINE__, section_name);
return EINVAL;
}
group_store_paths[i].store_paths.paths = \
storage_load_paths_from_conf_file_ex(pItemContext, \
section_name, false, &group_store_paths[i].store_paths.count, \
&result);
if (result != 0)
{
return result;
}
}
return 0;
}
int fdfs_mod_init()
{
IniContext iniContext;
int result;
int len;
int i;
char *pLogFilename;
char *pReponseMode;
char *pIfAliasPrefix;
char buff[2 * 1024];
bool load_fdfs_parameters_from_tracker = false;
log_init();
trunk_shared_init();
if ((result=iniLoadFromFile(FDFS_MOD_CONF_FILENAME, &iniContext)) != 0)
{
logError("file: "__FILE__", line: %d, " \
"load conf file \"%s\" fail, ret code: %d", \
__LINE__, FDFS_MOD_CONF_FILENAME, result);
return result;
}
do
{
group_count = iniGetIntValue(NULL, "group_count", &iniContext, 0);
if (group_count < 0)
{
logError("file: "__FILE__", line: %d, " \
"conf file: %s, group_count: %d is invalid!", \
__LINE__, FDFS_MOD_CONF_FILENAME, group_count);
return EINVAL;
}
url_have_group_name = iniGetBoolValue(NULL, "url_have_group_name", \
&iniContext, false);
if (group_count > 0)
{
if (!url_have_group_name)
{
logError("file: "__FILE__", line: %d, " \
"config file: %s, you must set " \
"url_have_group_name to true to " \
"support multi-group!", \
__LINE__, FDFS_MOD_CONF_FILENAME);
result = ENOENT;
break;
}
if ((result=fdfs_load_groups_store_paths(&iniContext)) != 0)
{
break;
}
}
else
{
char *pGroupName;
pGroupName = iniGetStrValue(NULL, "group_name", &iniContext);
if (pGroupName == NULL)
{
logError("file: "__FILE__", line: %d, " \
"config file: %s, you must set parameter: " \
"group_name!", __LINE__, FDFS_MOD_CONF_FILENAME);
result = ENOENT;
break;
}
my_group_name_len = snprintf(my_group_name, \
sizeof(my_group_name), "%s", pGroupName);
if (my_group_name_len == 0)
{
logError("file: "__FILE__", line: %d, " \
"config file: %s, parameter: group_name " \
"can't be empty!", __LINE__, \
FDFS_MOD_CONF_FILENAME);
result = EINVAL;
break;
}
if ((result=storage_load_paths_from_conf_file(&iniContext)) != 0)
{
break;
}
}
SF_G_CONNECT_TIMEOUT = iniGetIntValue(NULL, "connect_timeout", \
&iniContext, DEFAULT_CONNECT_TIMEOUT);
if (SF_G_CONNECT_TIMEOUT <= 0)
{
SF_G_CONNECT_TIMEOUT = DEFAULT_CONNECT_TIMEOUT;
}
SF_G_NETWORK_TIMEOUT = iniGetIntValue(NULL, "network_timeout", \
&iniContext, DEFAULT_NETWORK_TIMEOUT);
if (SF_G_NETWORK_TIMEOUT <= 0)
{
SF_G_NETWORK_TIMEOUT = DEFAULT_NETWORK_TIMEOUT;
}
load_log_level(&iniContext);
pLogFilename = iniGetStrValue(NULL, "log_filename", &iniContext);
if (pLogFilename != NULL && *pLogFilename != '\0')
{
if ((result=log_set_filename(pLogFilename)) != 0)
{
break;
}
}
storage_server_port = iniGetIntValue(NULL, "storage_server_port", \
&iniContext, FDFS_STORAGE_SERVER_DEF_PORT);
if ((result=fdfs_http_params_load(&iniContext, FDFS_MOD_CONF_FILENAME, \
&g_http_params)) != 0)
{
break;
}
pReponseMode = iniGetStrValue(NULL, "response_mode", &iniContext);
if (pReponseMode != NULL)
{
if (strcmp(pReponseMode, "redirect") == 0)
{
response_mode = FDFS_MOD_REPONSE_MODE_REDIRECT;
}
}
pIfAliasPrefix = iniGetStrValue (NULL, "if_alias_prefix", &iniContext);
if (pIfAliasPrefix == NULL)
{
*g_if_alias_prefix = '\0';
}
else
{
snprintf(g_if_alias_prefix, sizeof(g_if_alias_prefix),
"%s", pIfAliasPrefix);
}
load_fdfs_parameters_from_tracker = iniGetBoolValue(NULL, \
"load_fdfs_parameters_from_tracker", \
&iniContext, false);
if (load_fdfs_parameters_from_tracker)
{
result = fdfs_load_tracker_group_ex(&g_tracker_group, \
FDFS_MOD_CONF_FILENAME, &iniContext);
}
else
{
storage_sync_file_max_delay = iniGetIntValue(NULL, \
"storage_sync_file_max_delay", \
&iniContext, 24 * 3600);
use_storage_id = iniGetBoolValue(NULL, "use_storage_id", \
&iniContext, false);
if (use_storage_id)
{
result = fdfs_load_storage_ids_from_file( \
FDFS_MOD_CONF_FILENAME, &iniContext);
fastdfs-nginx-module-1.24
需积分: 0 143 浏览量
更新于2024-02-07
收藏 22KB GZ 举报
《FastDFS-Nginx-Module 1.24:高效文件服务器集成详解》
FastDFS-nginx-module 1.24 是一个针对 FastDFS 文件系统的 Nginx 模块,它使得 Nginx 可以无缝地与 FastDFS 集成,提供了高效的文件上传、下载服务。这一版本是针对 FastDFS 的最新更新,旨在优化性能,提高稳定性和兼容性,以满足现代互联网应用对高并发、大数据量存储和访问的需求。
FastDFS 是一个开源的高性能、轻量级的分布式文件系统,主要用于解决大容量存储和负载均衡问题。它的设计目标是简化文件服务器的搭建和管理,提供稳定可靠的文件存储服务。FastDFS 将文件存储和文件服务分离,使得文件服务器可以专注于存储,而通过特定的模块来处理文件访问请求。
Nginx 是一款高性能的 HTTP 和反向代理服务器,因其高效的非阻塞事件驱动模型而广受赞誉,常用于构建高性能的 Web 应用服务器。将 FastDFS-nginx-module 集成到 Nginx 中,可以在 Nginx 上直接处理文件上传和下载,减轻了后端 FastDFS 服务器的压力,提高了整体系统性能。
FastDFS-nginx-module 1.24 版本的特性包括:
1. **优化的文件上传功能**:支持断点续传,提高了大文件上传的效率和成功率。
2. **安全增强**:增加了对文件访问的权限控制,确保只有授权的用户才能访问指定的文件。
3. **性能提升**:通过优化内部算法,降低了系统资源消耗,提高了文件访问速度。
4. **更好的兼容性**:与 FastDFS 的多个版本保持兼容,确保升级或降级的灵活性。
5. **日志记录**:提供详细的日志记录,便于问题排查和性能分析。
6. **配置灵活**:允许自定义配置,以适应不同应用场景的需求。
集成 FastDFS-nginx-module 的步骤大致如下:
1. 安装 FastDFS 和 Nginx:首先需要在服务器上安装 FastDFS 和 Nginx,确保它们能够正常运行。
2. 下载 FastDFS-nginx-module:获取最新的 1.24 版本源码包,并解压到指定目录。
3. 编译和安装模块:将模块编译进 Nginx,通常涉及到修改 Nginx 的配置文件,添加模块路径。
4. 配置 Nginx:配置 Nginx 的 server 和 location 块,设定文件访问路径和相关参数。
5. 启动和测试:重启 Nginx 服务,验证 FastDFS-nginx-module 是否工作正常,进行上传和下载测试。
在实际应用中,FastDFS-nginx-module 1.24 可以广泛应用于各种需要大量文件存储和访问的场景,如图片分享网站、视频流媒体服务、云存储平台等。通过合理的配置和优化,可以为业务提供高效、稳定、安全的文件服务。
总结来说,FastDFS-nginx-module 1.24 是一个强大且成熟的解决方案,它将 FastDFS 的分布式文件存储能力和 Nginx 的高性能服务相结合,为开发者提供了一种便捷、高效的文件服务器搭建方式,对于需要处理大量文件操作的互联网应用来说,无疑是一个理想的选择。

不愛吃魚的喵
- 粉丝: 84
最新资源
- 人力资源方法:创新绩效工资计算法.doc
- actionscript和动画导出专题知识讲座.pptx
- 网络语言暴力-我们面对的究竟是什么?获奖科研报告论文.docx
- 工程网络安全实验实验报告.docx
- 互联网金融背景下金融投资风险防范研究.doc
- S120学习教程第一部分:产品介绍 03DRIVE-CLiQ 简介与拓扑规则
- 网络卫士脆弱性扫描与管理系统产品介绍.pptx
- 完美版资料嵌入式实习报告解读.docx
- 最新国家开放大学电大《土木工程力学(本科)》网络核心课形考网考作业及答案.pdf
- 计算机教学计划.docx
- 基于提升小波与DCT的自适应音频水印算法[最终版].pdf
- 集团公司集中式财务管理信息化系统方案.doc
- 基于PLC的锅炉燃烧控制系统_空燃比控制的WinCC组态和PLC设计说明.doc
- 计算机类毕业大学生年终总结.docx
- 云计算技术的发展与挑战.doc
- 科技创新项目管理实施细则.doc