C++ 网络编程项目fastDFS分布式文件系统(五)--nginx+fastdfs

news2024/11/15 5:56:40

目录

1. 文件上传下载流程

2. Nginx和fastDFS的整合

3. 数据库表

 3.1 数据库操

 3.2 数据库建表


1. 文件上传下载流程

        

 fileID 需要是一个哈希来判定。

 2. 文件下载流程

        

3. 优化        

优化思路 :
直接让客户端连接 fastDFS 的存储节点 , 实现文件下载
举例 , 访问一个 url 直接下载 :
http://192.168.247.147/group1/M00/00/00/wKj3k1tMBKuARhwBAAvea_OGt2M471.jpg

1. 客户端发送请求使用的协议 : http
     fastDFS 能不能解析 http 协议
      nginx能解析 http 协议
    在 nginx 中安装 fastDFS 的插件
2. 客户端怎么知道文件就存储在对应的那个存储节点上 ?
  上传的时候将 fileID 和存储节点 IP 地址都进行存储

2. NginxfastDFS的整合

        1. 在存储节点上安装Nginx, 将软件安装包拷贝到fastDFS存储节点对应的主机上

# 1. fastDFS 的存储节点
# 2. 在存储节点对应的主机上安装 Nginx, 安装的时候需要一并将插件装上
# - ( 余庆提供插件的代码 + nginx 的源代码 ) * 交叉编译 = Nginx

       2. 在存储节点对应的主机上安装Nginx, 作为web服务器

- fastdfs-nginx-module_v1.16.tar.gz 解压缩
# 1. 进入 nginx的源码安装目录 /home/lixiaoxiang/packages/nginx-1.10.1
# 2. 检测环境 , 生成 makefile
./configure --add-module = fastdfs 插件的源码目录 /src
make
sudo make install

make过程中的错误

# 1. fatal error: fdfs_define.h: No such file or directory
# 2. fatal error: common_define.h: No such file or directory
default: build
clean:
rm -rf Makefile objs
build:
$(MAKE) -f objs/Makefile
install:
$(MAKE) -f objs/Makefile install
modules:
$(MAKE) -f objs/Makefile modules
upgrade:
/usr/local/nginx/sbin/nginx -t
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
# 解决方案 - 修改 objs/Makefile
ALL_INCS = -I src/core \
-I src/event \
-I src/event/modules \
-I src/os/unix \
-I /usr/local/include/fastdfs \
-I /usr/local/include/fastcommon/ \
-I objs \
-I src/http \
-I src/http/modules\
-I /usr/include/fastdfs/

 3. 安装成功, 启动Nginx, 发现没有 worker进程

        

lixiaoxiang@ubuntu:/usr/local/nginx/sbin $ ps aux|grep nginx
root 65111 0 .0 0 .0 39200 696 ?Ss 10 :32 0 :00 nginx: master process
./nginx
robin 65114 0 .0 0 .0 16272 928 pts/9 S + 10 :32 0 :00 grep --color = auto
nginx

nginxlogs日志

        

# ERROR - file: shared_func.c, line: 968, file /etc/fdfs/mod_fastdfs.conf not exist
# 从哪儿找 -> fastDFS 插件目录中找
robin@OS:~/package/nginx/fastdfs-nginx-module/src $ tree
.
├── common.c
├── common.h
├── config
├── mod_fastdfs.conf -> cp /etc/fdfs
└── ngx_http_fastdfs_module.c
0 directories, 5 files

需要修改mod_fdfs.conf (etc/fdfs)文件, 参数当前存储节点的storage.conf进行修改  

# 存储 log 日志的目录
base_path=/home/robin/fastdfs/storage
# 连接 tracker 地址信息
tracker_server = 192 .168.91.130:22122
# 存储节点绑定的端口
storage_server_port = 23000
# 当前存储节点所属的组
group_name = group1
# 客户端下载文件的时候 , 这个下载的 url 中是不是包含组的名字
// 上传的 fileID: group1/M00/00/00/wKj3h1vJRPeAA9KEAAAIZMjR0rI076.cpp
// 完整的 url: http://192.168.1.100/group1/M00/00/00/wKj3h1vJRPeAA9KEAAAIZMjR0rI076.cpp
url_have_group_name = true
# 存储节点上存储路径的个数
store_path_count = 1
# 存储路径的详细信息
store_path0=/home/robin/fastdfs/storage

4. 重写启动 Nginx, 还是没有 worker 进程 , 查看 log 日志
# ERROR - file: ini_file_reader.c, line: 631, include file "http.conf" not exists,
line: "#include http.conf"
/etc/fdfs 下找的时候不存在
- fastDFS 源码安装目录找 /conf
        - sudo cp http.conf /etc/fdfs
#lixiaoxiang@ubuntu:~/packages/fastdfs-5.10/conf$ sudo cp http.conf /etc/fdfs/
 
# ERROR - file: shared_func.c, line: 968, file /etc/fdfs/mime.types not exist
- nginx 的源码安装包中找 /conf
        - sudo cp mime.types /etc/fdfs
#lixiaoxiang@ubuntu:~/packages/nginx-1.10.1/conf$ sudo cp mime.types /etc/fdfs/
        

 5. 通过浏览器请求服务器下载文件: 404 Not Found

http://192.168.1.100/group1/M00/00/00/wKj3h1vJRPeAA9KEAAAIZMjR0rI076.jpg
# 错误信息
open() "/usr/local/nginx/zyFile2/group1/M00/00/00/wKj3h1vJSOqAM6RHAAvqH_kipG8229.jpg"
failed (2: No such file or directory), client: 192.168.247.1, server: localhost,
request: "GET /group1/M00/00/00/wKj3h1vJSOqAM6RHAAvqH_kipG8229.jpg HTTP/1.1", host:
"192.168.247.135"
服务器在查找资源时候 , 找的位置不对 , 需要给服务器指定一个正确的位置 , 如何指定 ?
- 资源在哪 ? ====>  在存储节点的存储目录中 store_path0
- 如何告诉服务器资源在这 ? =====> 在服务器端添加 location 处理
locatioin /group1/M00/00/00/wKj3h1vJSOqAM6RHAAvqH_kipG8229.jpg
location /group1/M00/00/00/
location /group1/M00/
location /group1/M00/
{
        # 告诉服务器资源的位置
        root /home/robin/fastdfs/storage/data;
        #关键字
        ngx_fastdfs_module;
}

项目遇到的问题:

        一直无法加载到图片,最后发现mod_fdfs.conf 里面store_path0=/home/robin/fastdfs/storage 路径协程了 fastfds 错误,导致加载不出来。花了一个小时,最后想起来看日志信息。发现里面的路径不对,修改了 了路径就可以了

3. 数据库表

        3.1 数据库操

        1. 创建一个名称为cloud_disk的数据库

                CREATE DATABASE cloud_disk;

        2. 删除数据库 cloud_disk
         drop database cloud_disk;
        3. 使用数据库 cloud_disk
         use cloud_disk;

 3.2 数据库建表

        1. 用户信息表 -- user

        

CREATE TABLE user (
id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT ,
name VARCHAR ( 128 ) NOT NULL ,
nickname VARCHAR ( 128 ) NOT NULL ,
password VARCHAR ( 128 ) NOT NULL ,
phone VARCHAR ( 15 ) NOT NULL ,
createtime VARCHAR ( 128 ),
email VARCHAR ( 100 ),
CONSTRAINT uq_nickname UNIQUE (nickname),
CONSTRAINT uq_name UNIQUE (NAME)
);

 2. 文件信息表 - user_file_list

CREATE TABLE user_file_list (
user VARCHAR ( 128 ) NOT NULL ,
md5 VARCHAR ( 200 ) NOT NULL ,
createtime VARCHAR ( 128 ),
filename VARCHAR ( 128 ),
shared_status INT ,
pv INT
);
        3. 用户文件列表 - user_file_list
        

CREATE TABLE user_file_list (
user VARCHAR ( 128 ) NOT NULL ,
md5 VARCHAR ( 200 ) NOT NULL ,
createtime VARCHAR ( 128 ),
filename VARCHAR ( 128 ),
shared_status INT ,
pv INT
);
4. 用户文件数量表 - user_file_count
        

CREATE TABLE user_file_count (
user VARCHAR ( 128 ) NOT NULL PRIMARY KEY ,
count INT
);

 5. 共享文件列表 - share_file_list

        

CREATE TABLE share_file_list (
user VARCHAR ( 128 ) NOT NULL ,
md5 VARCHAR ( 200 ) NOT NULL ,
createtime VARCHAR ( 128 ),
filename VARCHAR ( 128 ),
pv INT
);

 

1. fastCGI
1. 是什么 ?
        运行在服务器端的代码, 帮助服务器处理客户端提交的动态请求
2. 干什么
        帮助服务器处理客户端提交的动态请求
3. 怎么用 ?
        nginx如何转发数据
# 分析出客户端请求对应的指令 -- /test
location / test
{
# 转发出去
fastcgi_pass 地址 : 端口 ;
include fastcgi.conf;
}

 fastcgi如何接收数据

# 启动 , 通过 spawn-fcgi 启动
spawn-fcgi -a IP -p port -f ./fcgi
# 编写 fastCGI 程序的时候
- 接收数据 : 调用读终端的函数就是接收数据
- 发送数据 : 调用写终端的函数就是发送数据
fastcgi 如何处理数据
        
// 编写登录的 fastCgI 程序
int main ()
{
        while ( FCGI_Accept () >= 0 )
        {
        // 1. 接收登录信息 -> 环境变量中
        // post -> 读数据块的长度 CONTENT-LENGTH
        // get -> 从请求行的第二部分读 QUEERY_STRING
        // 2. 处理数据
        // 3. 回发结果 -> 格式假设是 json
        printf ( "Content-type: application/json" );
        printf ( "{\"status\":\"OK\"}" )
        }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/901517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI重新定义音视频生产力“新范式”

// 编者按:AIGC无疑是当下的热门话题和场景。面对AI带来的技术变革和算力挑战,该如何应对?LiveVideoStackCon 2023上海站邀请到了网心科技副总裁武磊为我们分享网心在面对AI应用场景和业务需求下的实践经验。 文/武磊 编辑/LiveVideoStack …

泛型编程 学习笔记

#include "iostream"using namespace std;template<typename T> void Print(T a) {cout << a << endl; }int main() {int a 5;double b 2.3;char c e;string d "sdfasd";Print(a);Print(b);Print(c);Print(d);return 0; } 它可以不用…

关于springboot项目测试文件的目录结构

问题一 我在开发微服务项目的时候&#xff0c;有时候有些微服务是不需要启动类和配置文件的&#xff08;如xuechengService&#xff09;&#xff0c;这时候我们还需要在测试方法中进行测试&#xff0c;这时候我们可以将启动类放在测试类中&#xff0c;注意放在测试类中包的位置…

7-8 韩信点兵

分数 10 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 在中国数学史上&#xff0c;广泛流传着一个“韩信点兵”的故事&#xff1a;韩信是汉高祖刘邦手下的大将&#xff0c;他英勇善战&#xff0c;智谋超群&#xff0c;为汉朝建立了卓越的功劳。据说韩信的数学水平也非…

Ctfshow web入门 权限维持篇 web670-web679 详细题解 全

CTFshow 权限维持 web670【】 补充一下PHP中单双引号的区别&#xff1a; 单引号和双引号之间最显着的区别在于我们插入字符串和变量时。单引号不插入字符串和变量。**单引号内的内容会按原样打印出来。**在大多数情况下&#xff0c;单引号内没有任何变量或转义序列的编译。 …

论文《LoRA: Low-Rank Adaptation of Large Language Models》阅读

论文《LoRA: Low-Rank Adaptation of Large Language Models》阅读 BackgroundIntroducitonProblem StatementMethodology Δ W \Delta W ΔW 的选择 W W W的选择 总结 今天带来的是由微软Edward Hu等人完成并发表在ICLR 2022上的论文《LoRA: Low-Rank Adaptation of Large Lan…

Java 日期格式(yyyy-MM-dd HH:mm:ss SSS)

常用格式为&#xff1a;yyyy-MM-dd HH:mm:ss 以 2019-12-31 06:07:59:666 时间为例&#xff1a; 字符 含义 Example y&#xff08;小写的y&#xff09; 年 yyyy---->2019 M&#xff08;大写的M&#xff09; 月 MM---->12 d&#xff08;小写的d&#xff09; 一…

使用Jmeter自带recorder代理服务器录制接口脚本

脚本录制 配置线程组 添加代理服务器 端口 和 录制脚本放置位置可根据需要设置 启动录制 点击启动后 弹出创建证书提示&#xff0c;点击OK 这个证书后续需要使用到 然后可见 一个弹窗。 Recorder . 本质是代理服务录制交易控制 可设置对应数据 方便录制脚本的查看 证书配置…

关于es中索引,倒排索引的理解

下面是我查询进行理解的东西 也就是说我们ES中的索引就相当于我们mysql中的数据库表&#xff0c;索引库就相当于我们的数据库&#xff0c;我们按照mapping规则会根据相应的字段&#xff08;index为true默认&#xff09;来创建倒排索引&#xff0c;这个倒排索引就相当于我们索引…

配置覆盖/获取追踪id

12 配置覆盖 提供了配置覆盖功能通过启动命令动态指定服务名&#xff0c;agent只需要部署一份。系统配置 -Dskywalking.agent.service_nameskywalking_mysql探针配置 指定jar包后&#xff0c;继续指定探针配置。系统环境变量覆盖优先级 探针配置>系统配置>系统环境变量&…

ONES × 鲁邦通|打造研发一体化平台,落地组织级流程规范

近日&#xff0c;ONES 签约工业互联网行业领先的解决方案提供商——鲁邦通&#xff0c;助力鲁邦通优化组织级流程规范&#xff0c;落地从需求到交付的全生命周期线上化管理。 依托于 ONES 一站式研发管理平台&#xff0c;鲁邦通在软硬件设计开发、项目管理和精益生产等方面的数…

企微配置回调服务

文章目录 一、简介1、概述2、相关文档地址 二、企微配置消息服务器1、配置消息接收参数2、参数解析3、参数拼接规则 三、代码编写—使用已有库1、代码下载2、代码修改3、服务代码编写 四、测试 一、简介 1、概述 什么时候需要回调服务 在集成企业微信与内部系统时&#xff0…

Spring 6.0官方文档示例(24): replace-method的用法

一、原始bean定义 package cn.edu.tju.study.service.anno.domain;public class MyValueCalculator {public String computeValue(String input) {return "you inputted: " input;}// some other methods... }二、replace bean定义 package cn.edu.tju.study.serv…

Win11中zookeeper的下载与安装

下载步骤 打开浏览器&#xff0c;前往 Apache ZooKeeper 的官方网站&#xff1a;zookeeper官方。在主页上点击"Project"选项&#xff0c;并点击"Release" 点击Download按钮&#xff0c;跳转到下载目录 在下载页面中&#xff0c;选择版本号&#xff0c;并点…

【王道-进程与线程】

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.0 引言No.1 进程的概念、组成、特征一、进程的概念二、进程的组成1、PCB进程控制块2、程序段/数据段 三、程序是如何运行的&#xff1f;四、进程的特征五、总结 No.2 进程的状态转换和组织一、进程的状态1、创建态、就绪态…

Linux网络编程:Socket套接字编程(Server服务器 Client客户端)

文章目录&#xff1a; 一&#xff1a;定义和流程分析 1.定义 2.流程分析 3.网络字节序 二&#xff1a;相关函数 IP地址转换函数inet_pton inet_ntop&#xff08;本地字节序 网络字节序&#xff09; socket函数(创建一个套接字) bind函数(给socket绑定一个服务器地址结…

【数据库系统】--【5】DBMS查询处理

DBMS查询处理 01查询处理概述02查询编译词法、语法分析语义分析查询重写查询优化 03查询执行算法04查询执行模型 01查询处理概述 02查询编译 词法、语法分析 语义分析 查询重写 查询优化 03查询执行算法 04查询执行模型 小结 ● 查询处理概述 ● 查询编译 词法、语法分析语义分…

解决:(error) ERR unknown command shutdow,with args beginning with

目录 一、遇到问题 二、出现问题的原因 三、解决办法 一、遇到问题 要解决连接redis闪退的问题&#xff0c;按照许多的方式去进行都没有成功&#xff0c;在尝试使用了以下的命名去尝试时候&#xff0c;发现了这个问题。 二、出现问题的原因 这是一个粗心大意导致的错误&am…

远程线程注入(简单样例以及原理)

远程线程注入(简单样例以及原理) 注入的目标是将我们的代码注入到目标进程的地址空间中 注入通常可以根据注入的内容分为两种类型&#xff1a; shellcode注入 &#xff1a;这种注入是将我们的代码直接注入到目标内存中&#xff0c;这就要保证我们的代码在贴到其他地址上后仍…

7-2 求矩阵各行元素之和

分数 15 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 本题要求编写程序&#xff0c;求一个给定的mn矩阵各行元素之和。 输入格式&#xff1a; 输入第一行给出两个正整数m和n&#xff08;1≤m,n≤6&#xff09;。随后m行&#xff0c;每行给出n个整数&#xff0c;其间…