当前位置: 首页 > news >正文

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

目录

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\"}" )
        }
}

相关文章:

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

目录 1. 文件上传下载流程 2. Nginx和fastDFS的整合 3. 数据库表 3.1 数据库操 3.2 数据库建表 1. 文件上传下载流程 fileID 需要是一个哈希来判定。 2. 文件下载流程 3. 优化 优化思路 : 直接让客户端连接 fastDFS 的存储节点 , 实现文件下载 举例 , 访问一个…...

开发者本地搭建性能监测工具(Windows)

ElasticSearch 8.9.0 开发模式安装 JDK安装 官方提供版本与JDK支持关系:https://www.elastic.co/cn/support/matrix#matrix_jvm 我们安装Elasticsearch 8.9.x,看到支持的最低JDK版本是17。 JDK(Windows/Mac含M1/M2 Arm原生JDK)…...

嵌入式Linux开发实操(八):UART串口开发

串口可以说是非常好用的一个接口,它同USB、CAN、I2C、SPI等接口一样,为SOC/MCU构建了丰富的接口功能。那么在嵌入式linux中又是如何搭建和使用UART接口的呢? 一、Console接口即ttyS0 ttyS0通常做为u-boot(bootloader的一种,像是Windows的BIOS),它需要一个交互界面,一般…...

公告:微信小程序备案期限官方要求

备案期限要求 1、若微信小程序未上架,自2023年9月1日起,微信小程序须完成备案后才可上架,备案时间1-20日不等; 2、若微信小程序已上架,请于2024年3月31日前完成备案,逾期未完成备案,平台将按照…...

cesium中获取高度的误区

this.ellipsoid viewer.scene.globe.ellipsoid; var cartesian viewer.camera.pickEllipsoid(e.position, this.ellipsoid);if(cartesian){// 苗卡尔椭球体的三维坐标 转 地图坐标(弧度)var cartographic viewer.scene.globe.ellipsoid.cartesianToCa…...

基于Centos:服务器基础环境安装: JDK、Maven、Python、Go、Docker、K8s

创建用户 useradd dev groupadd op chown -R :op /opt chmod -R 770 /opt usermod -aG op devJDK8 yum install -y java-1.8.0-openjdk-devel echo export JAVA_HOME/usr/lib/jvm/java-1.8.0/>> /etc/profilesource /etc/profileJDK11 yum install -y java-11-openjd…...

Elasticsearch的数据删除策略只能触发一次

在Elasticsearch中,可以使用Index Lifecycle Management(ILM)来设置删除数据的保留时长。ILM是Elasticsearch的一项功能,用于管理索引的生命周期,包括数据保留、备份、归档等操作。 要设置删除数据的保留时长&#xf…...

Open3D 最小二乘拟合空间直线(方法一)

目录 一、算法原理1、空间直线2、最小二乘法拟合二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、空间直线 x −...

解决uniapp 二次登陆 登录页是首页时,登录页闪现问题

pages.json文件中,pages数组中第一项是登录页,用户第一次登录后,存储登录状态,以后再进入应用时,自动登录跳转至首页。 但是自动登录跳转至首页时,登录页总是会闪现一下。 第一步:manifest.js…...

如何快速制作一个房地产电子传单?

在如今高度数字化的时代,电子传单成为了宣传推广的一种重要方式。下面将介绍如何利用乔拓云平台快速制作一个房地产电子传单。 第一步,找一个可靠的第三方制作平台/工具,比如乔拓云平台。乔拓云平台是一个功能强大、简单易用的电子传单制作工…...

golang云原生项目之:etcd服务注册与发现

服务注册与发现:ETCD 1直接调包 kitex-contrib: 上面有实现的案例,直接cv。下面是具体的理解 2 相关概念 EtcdResolver: etcd resolver是一种DNS解析器,用于将域名转换为etcd集群中的具体地址,以便应用程序可以与et…...

arm:day4

1. 实现三盏灯的点亮 .text .global _start_start: led1初始化函数LED_INIT: 1 通过RCC_AHB4_ENSETR寄存器&#xff0c;设置GPIOE F组控制器使能 0x50000A28[5:4]1ldr r0,0X50000A28ldr r1,[r0]orr r1,r1,#(0X3<<4)str r1,[r0] 2.1 通过GPIOE_MODER寄存器&#xff0c;…...

flutter 常见的状态管理器

flutter 常见的状态管理器 前言一、Provider二、Bloc三、Redux四、GetX总结 前言 当我们构建复杂的移动应用时&#xff0c;有效的状态管理是至关重要的&#xff0c;因为应用的不同部分可能需要共享数据、相应用户交互并保持一致的状态。Flutter 中有多种状态管理解决方案&#…...

Kotlin的Map

在 Kotlin 中&#xff0c;Map 是一种键值对的集合数据结构&#xff0c;用于存储一组关联的键和值。Kotlin 标准库提供了 Map 接口和多种实现类&#xff0c;使得操作和处理键值对数据更加方便。下面详细描述 Kotlin 的 Map 的用法&#xff1a; 创建 Map Kotlin 提供了几种方式…...

STM32 串口复习

按数据通信方式分类&#xff1a; 串行通信&#xff1a;数据逐位按顺序依次传输。传输速率较低&#xff0c;抗干扰能力较强&#xff0c;通信距离较长&#xff0c;I/O资源占用较少&#xff0c;成本较低。并行通信&#xff1a;数据各位通过多条线同时传输。 按数据传输方向分类&…...

VScode替换cmd powershell为git bash 终端,并设置为默认

效果图 步骤 1. 解决VScode缺少git bash的问题_failed to start bash - is git-bash.exe on the syst_Rudon滨海渔村的博客-CSDN博客效果解决步骤找到git安装目录下的/bin/bash.exe&#xff0c;复制其绝对路径&#xff0c;例如D:\Program Files\Git\bin\bash.exe把路径的右斜…...

网络基础(一)桥接网络

网络基础知识 桥接网络 桥接网络是一种网络设计技术&#xff0c;其目的是将两个或多个网络段连接在一起&#xff0c;使它们在逻辑上表现为单个网络。这通过使用网络桥来实现&#xff0c;网络桥工作在数据链路层&#xff08;第2层&#xff09;&#xff0c;只关心MAC地址&#…...

C#程序变量统一管理例子 - 开源研究系列文章

今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子。 我们知道&#xff0c;在C#里使用变量&#xff0c;除了private私有变量外&#xff0c;程序中使用到的公共变量就需要进行统一的存放和管理。这里笔者使用到的公共变量管理库划分为&#xff1a;1)窗体&#xff1b;2)…...

信息熵,信息增益,增益率的理解

西瓜数据集D如下: 编号色泽根蒂敲声纹理脐部触感好瓜1青绿蜷缩浊响清晰凹陷硬滑是2乌黑蜷缩沉闷清晰凹陷硬滑是3乌黑蜷缩浊响清晰凹陷硬滑是4青绿蜷缩沉闷清晰凹陷硬滑是5浅白蜷缩浊响清晰凹陷硬滑是6青绿稍蜷浊响清晰稍凹软粘是7乌黑稍蜷浊响稍糊稍凹软粘是8乌黑稍蜷浊响清晰…...

二级MySQL(一)——基本概念与方法

数据库系统的核心是【数据库管理系统】 E-R图提供了表示信息世界中的方法&#xff0c;主要有实体、属性和【联系】 E-R图是数据库设计的工具之一&#xff0c;一般适用于建立数据库的【概念模型】 将E-R图转换到关系模式时&#xff0c;实体与联系都可以表示成【关系】 关系数…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器&#xff1f;1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...