C++文件服务器项目—Nginx+FastDFS插件—5

2023-05-16

C++文件服务器项目—Nginx+FastDFS插件—5

  • 前言
  • 1. 文件上传下载流程
    • 1.1 文件上传流程
    • 1.2 文件下载流程
    • 1.3 文件下载优化流程
  • 2. Nginx和fastDFS插件
    • 2.1 安装Nginx和fastdfs-nginx-module插件
    • 2.2 解决Nginx无法正常启动的问题
    • 2.3 通过URL下载文件: 404 Not Found
  • 3. 上传大文件Nginx设置

前言

  本文介绍了Nginx+FastDFS插件的安装流程以及文件上传下载的流程。文件安装包、源码地址:gopherWxf git

  本专栏知识点是通过零声教育的线上课学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接 C/C++后台高级服务器课程介绍 详细查看课程的服务。

1. 文件上传下载流程

1.1 文件上传流程

在这里插入图片描述
文件上传流程:

  1. 客户端发送上传文件请求
  2. nginx只能处理静态请求,所以调用fastCGI
  3. fastCGI程序读取数据,临时存储到本地磁盘
  4. fastCGi程序将文件上传到fastDFS,返回fileID
  5. 将文件名,和返回fileID等信息存储到数据库(业务逻辑细节不做展开,后续介绍)
  6. 删除本地的临时文件

1.2 文件下载流程

在这里插入图片描述

文件下载流程:

  1. 客户端发送下载文件请求
  2. nginx只能处理静态请求,所以调用fastCGI
  3. fastCGI程序从数据库中获得对应的fileID
  4. fastCGI程序从fastDFS通过fileID下载文件
  5. 将文件回发给客户端
  6. 删除磁盘的临时文件

1.3 文件下载优化流程

在这里插入图片描述

  如果下载能够直接让客户端连接fastDFS的存储节点, 实现文件下载,那么下载的流程就非常简单了。

# 举个例子
http://192.168.109.100/group1/M00/00/00/wKj3k1tMBKuARhwBAAvea_OGt2M471.jpg

  想要实现这个优化有几个问题需要解决:

  1. 客户端发送请求使用的协议:http。而fastDFS不能解析http协议
    • nginx能解析http协议。
    • nginx和fdfs是两个独立的进程,互不干涉
    • 在存储节点上安装一个nginx,让nginx帮助它解析http请求
    • 收到之后把数据发送给nginx,nginx再把数据发送给客户端
    • 这里的小nginx就相当于中转
    • 中转就要求nginx和storage能够进行数据交互
    • 在nginx中安装fastDFS的插件
  2. 客户端怎么知道文件存储在哪个存储节点storage上?
    • 上传的时候存储过<文件名,fileID>
    • 通过nginx服务器查询并返回该信息。

在这里插入图片描述

文件下载优化流程

  1. 客户端发送下载请求
  2. nginx服务器去数据库查询fileID以及是哪台storage存储数据,组装url发回给客户端
  3. 客户端通过URL访问fastDFS
  4. fastDFS通过Nginx和插件,将数据回发
  5. 客户端完成下载

2. Nginx和fastDFS插件

2.1 安装Nginx和fastdfs-nginx-module插件

  1. 所有的存储节点上安装Nginx, 将软件安装包拷贝到fastDFS存储节点对应的主机上。注意了,一定是存储节点,至于原因在上面优化流程以及说过了。文件压缩包在前言中。
# 1. 找fastDFS的存储节点
# 2. 在存储节点对应的主机上安装Nginx, 安装的时候需要一并将插件(fastdfs-nginx-module)装上
#	- (余庆提供插件的代码   +   nginx的源代码 ) * 交叉编译 = Nginx  
  1. 在存储节点对应的主机上安装Nginx, 作为web服务器
root@wxf:/source_code_dir# tar zxvf nginx-1.16.1.tar.gz
root@wxf:/source_code_dir# tar zxvf fastdfs-nginx-module-1.22.tar.gz
root@wxf:/source_code_dir# cd fastdfs-nginx-module-1.22/
root@wxf:/source_code_dir/fastdfs-nginx-module-1.22# vi INSTALL

  这里面告诉我们在安装nginx的时候,要带上fastdfs-nginx-module/src目录,然后再安装
在这里插入图片描述

# 1. 进入nginx的源码安装目录
# 2. 检测环境, 生成makefile
# ./configure --add-module=fastdfs插件的源码目录/src
# make
# sudo make install
root@wxf:/source_code_dir# cd nginx-1.16.1/
root@wxf:/source_code_dir/nginx-1.16.1# ./configure --add-module=/source_code_dir/fastdfs-nginx-module-1.22/src
root@wxf:/source_code_dir/nginx-1.16.1# make
root@wxf:/source_code_dir/nginx-1.16.1# make install

2.2 解决Nginx无法正常启动的问题

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

没有work进程

root@wxf:/usr/local/nginx/conf# nginx 
root@wxf:/usr/local/nginx/conf# ps aux |grep nginx
root       8948  0.0  0.0  33180   472 ?        Ss   14:22   0:00 nginx: master process nginx
root       9156  0.0  0.0  13140  1104 pts/1    S+   14:25   0:00 grep --color=auto nginx

在这里插入图片描述
找nginx的logs日志
在这里插入图片描述
提示:file /etc/fdfs/mod_fastdfs.conf not exist

# ERROR - file: shared_func.c, line: 1301, file /etc/fdfs/mod_fastdfs.conf not exist
# 从哪儿找 -> fastDFS插件目录中找
root@wxf:/source_code_dir/fastdfs-nginx-module-1.22/src# tree 
.
├── common.c
├── common.h
├── config
├── mod_fastdfs.conf
└── ngx_http_fastdfs_module.c

root@wxf:/source_code_dir/fastdfs-nginx-module-1.22/src# cp mod_fastdfs.conf /etc/fdfs
root@wxf:/etc/fdfs# ls
client.conf     mime.types.back   storage.conf      tracker.conf storage_ids.conf

  需要修改mod_fdfs.conf文件, 参数按照当前存储节点的storage.conf进行修改。storage.conf里面怎么配置,mod_fdfs.conf就怎么配置。

# 存储log日志的目录
base_path=/fastdfs/storage
# 连接tracker地址信息
tracker_server=192.168.109.101:22122
# 存储节点绑定的端口
storage_server_port=23000
# 当前存储节点所属的组
group_name=group1

# 客户端下载文件的时候, 这个下载的url中是不是包含组的名字
# 上传的fileID: group1/M00/00/00/wKj3h1vJRPeAA9KEAAAIZMjR0rI076.cpp
# 完整的url: http://192.168.109.101/group1/M00/00/00/wKj3h1vJRPeAA9KEAAAIZMjR0rI076.cpp
url_have_group_name = true

# 存储节点上存储路径的个数
store_path_count=1
# 存储路径的详细信息
store_path0=/fastdfs/storage
  1. 重启启动Nginx, 还是没有worker进程, 查看log日志
# ERROR - file: ini_file_reader.c, line: 1051, include file "http.conf" not exists, line: "#include http.conf"
从 /etc/fdfs 下找的时候不存在
	- 从fastDFS源码安装目录找/conf
	- sudo cp http.conf /etc/fdfs
# ERROR - file: shared_func.c, line: 1301, file /etc/fdfs/mime.types not exist
从 /etc/fdfs 下找的时候不存在
	- 从fastDFS源码安装目录找/conf
	- sudo cp mime.types /etc/fdfs

root@wxf:/source_code_dir/fastdfs/conf# cp mime.types /etc/fdfs/
root@wxf:/source_code_dir/fastdfs/conf# cp http.conf /etc/fdfs/

  现在nginx是正常的启动了
在这里插入图片描述

2.3 通过URL下载文件: 404 Not Found

# 上传一张gopher的照片
root@wxf:/temp# fdfs_upload_file /etc/fdfs/client.conf gopher.png 
group1/M00/00/00/wKhtZWMaAlyAD9WYAABR1ZotbJI570.png

通过浏览器请求服务器下载文件: 404 Not Found在这里插入图片描述

查看一下error日志,发现是路径不对,需要配置location

# http://192.168.109.101/group1/M00/00/00/wKhtZWMaAlyAD9WYAABR1ZotbJI570.png
2022/09/08 14:56:02 [error] 9415#0: *1 
open() "/usr/local/nginx/html/group1/M00/00/00/wKhtZWMaAlyAD9WYAABR1ZotbJI570.png" 
failed (2: No such file or directory), 
client: 192.168.109.1, server: localhost, 
request: "GET /group1/M00/00/00/wKhtZWMaAlyAD9WYAABR1ZotbJI570.png HTTP/1.1", 
host: "192.168.109.101"
http://192.168.109.101/group1/M00/00/00/wKhtZWMaAlyAD9WYAABR1ZotbJI570.png
# 错误信息
open() "/usr/local/nginx/html/group1/M00/00/00/wKhtZWMaAlyAD9WYAABR1ZotbJI570.png" failed (2: No such file or directory), client: 192.168.109.1, server: localhost, request: "GET /group1/M00/00/00/wKhtZWMaAlyAD9WYAABR1ZotbJI570.png HTTP/1.1", host: "192.168.109.101"


# /usr/local/nginx/html/group1/M00/00/00/wKhtZWMaAlyAD9WYAABR1ZotbJI570.png
服务器在查找资源时候, 找的位置不对,所以找不到

需要给服务器指定一个正确的位置, 如何指定?
	- 资源在哪? 在存储节点的存储目录中 store_path0
	- 如何告诉服务器资源在这? 在服务器端添加location处理

按照之前文章介绍的指令查找方法,可以可以把指令提取出来
- location /group1/M00/00/00/

但是后面的两个目录00/00/,有很多个,而且文件存储的时候是随机存的
- 难道我们要写这么多个location?
- location采用的是模糊匹配
- 所以我们直接把指令缩短
- location /group1/M00/

location /group1/M00/
{
	# 告诉服务器资源的位置store_path0
	root /home/robin/fastdfs/storage/data;
	ngx_fastdfs_module;
}

在分布式里面,可能有多个group,多个目录Mxx
- 难道还要把所有的可能都枚举写出来吗
- 用正则即可
location ~/group([0-9])/M([0-9])([0-9]) {
	# 告诉服务器资源的位置store_path0
	# 这个root真的正确吗?
	root /home/robin/fastdfs/storage/data;
	ngx_fastdfs_module;
}

上面也说了,可能有多个目录,也就意味着store_path可能有多个,
那root要与location的指令对应,指令都用正则了,root怎么写?
- 不用写,ngx_fastdfs_module会帮我们处理
- 上文我们以及配置过mod_fastdfs.conf
- 会从这里面找资源存储的位置

  在/usr/local/nginx/conf/nginx.conf中配置location
在这里插入图片描述

  可以看到我们上传的图片被下载下来了。这里被浏览器显示图片的原因是谷歌浏览器会自动打开图片。

在这里插入图片描述

在这里插入图片描述

3. 上传大文件Nginx设置

  1. 413 错误

    服务器提示:413 Request Entity Too Large 的解决方法

    • 原因: 上传文件太大, 请求实体太长了

    • 解决方案:

      • 在配置文件nginx.conf中添加: client_max_body_size 10M
        • xxxM: 用户指定的大小多少兆(M)
  2. 设置的位置:

    • 在http{ }中设置:client_max_body_size 20m;

      • 所有的server中的所有的location都起作用
    • 在server{ }中设置:client_max_body_size 20m;

      • 对当前server的所有的location生效
    • 在location{ }中设置:client_max_body_size 20m;

      • 只对当前location生效
  3. 三者的区别是:

    • http{} 中控制着所有nginx收到的 http 请求。

    • 报文大小限制设置在server{}中,控制该server收到的请求报文大小

    • 如果配置在location中,则报文大小限制,只对匹配了location 路由规则的请求生效。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++文件服务器项目—Nginx+FastDFS插件—5 的相关文章

  • nginx + python + websocket

    我如何配置nginx 最新版本 他们说它支持websockets 来支持WebSockets 我如何使用 python 来运行 websockets 连接 这就是我想要的 客户端使用 JavaScript 创建 WebSocket webs
  • 缓存 auth_request 中的令牌

    我想缓存请求标头字段授权中的令牌 Authorization Bearer abcdefghijklmnopqrstuvwxyz 我的目标是 我不必验证验证服务器上的每个请求 如果授权令牌已缓存 且有效 则请求应调用 API 而无需验证 l
  • 使用 Flask 代理到另一个 Web 服务

    我想将对 Flask 应用程序发出的请求代理到计算机上本地运行的另一个 Web 服务 我宁愿使用 Flask 而不是更高级别的 nginx 实例 这样我们就可以重用应用程序中内置的现有身份验证系统 我们越能保持这种 单点登录 越好 是否有现
  • Sqlalchemy 返回 SELECT 命令的不同结果(query.all)

    我有网络服务器 512 RAM FLASK SQLAlchemy SQLite gt uWSGI gt Nginx 问题 Sqlalchemy 返回 SELECT 命令 query all 的不同结果 Example 在数据库中添加了一些记
  • 无法从 Nginx 反向代理后面的 docker 容器提供静态资源

    我正在尝试使用 Nginx 作为反向代理来为两个容器提供服务 这是我的 Nginx conf 文件的一部分 upstream dashboard server dashboard 80 upstream editor server edit
  • 使用 nginx 时在 dotnet core 中获取真实客户端 IP 地址

    我正在使用 dotnet 核心 我正在使用线路获取 IP 地址Request HttpContext Connection RemoteIpAddress ToString 当我使用我的 IP 地址访问我的网站时 我看到客户端 IP 地址显
  • Nginx no-www 到 www 以及 www 到 no-www

    我在用按照教程在 Rackspace 云上安装 nginx http www howtoforge com running phpmyadmin on nginx lemp on debian squeeze ubuntu 11 04并在网
  • Nginx 位置“不等于”正则表达式

    我该如何设置locationNginx 中的条件是否响应任何不等于列出的位置 I tried location dir1 file2 php rewrite http example com 1 permanent 但它不会触发重定向 它只
  • Websocket-rails 不适用于 Nginx 和 Unicorn 的生产环境

    我有 Rails 3 2 应用程序和 gem websocket rails 0 7 在开发机器上 一切正常 在生产环境中 我使用 Nginx 1 6 作为代理服务器 使用 Unicorn 作为 http 服务器 Thin 用于独立模式 如
  • 使用 Clapprjs 在网页上流式传输 .m3u8

    我使用 nginx rtmp 将 rtmp 转换为 hls 并使用 Clappr 在网页中进行流式传输 但 Clappr 采用旧的 ts 段 导致 404 错误 因为它在服务器上被删除 如何解决这个问题 抱歉 这是我第一次使用 nginx
  • nginx 服务器中不允许方法 405 错误

    我们的反应应用程序在我们的本地机器上正常工作 但我们将其延迟到更高的环境中 它不起作用 它发送405 Method not allowed error 页面正在加载 每当我们要求时submit form这个问题来了 下面是我的nginx c
  • 如何在Python中在后台运行长时间运行的作业

    我有一个运行长时间运行的作业 大约几个小时 的网络服务 我正在使用 Flask Gunicorn 和 nginx 来开发它 我想做的是让需要很长时间才能完成的路线 调用创建线程的函数 然后 该函数将向路由返回一个 guid 并且路由将返回一
  • 为从 nginx 反向代理转发的请求添加唯一 id

    我们运行 nginx 作为反向代理 将请求转发到运行 Compojure 的 Clojure 应用程序 Compojure 是一个封装 Jetty 的库 为我们的应用程序提供服务 Web 请求的能力 目前 我们捕获 nginx 和 Cloj
  • Amazon ECS - 在 Docker 入口点上使用 IAM 角色时权限被拒绝

    我正在寻找一种将机密 证书注入 Amazon ECS 容器的方法 就我而言 它是一个简单的 nginx 容器 我一直在使用 AWS Parameter Store 关注这篇文章 https aws amazon com blogs comp
  • uWSGI重启时停机

    每次当我有代码更新时重新启动服务器时 我都会遇到 uwsgi 问题 当我使用 sudo restart account 重新启动 uwsgi 时 停止和启动实例之间存在一个小间隙 导致停机并停止所有当前请求 当我尝试 sudo reload
  • ./manage.py 使用 https 运行服务器

    manage py 运行服务器 0 0 0 0 8000 我使用上面的行作为我从 github 借用的代码的一部分 https github com ribeiroit boh puppet https github com ribeiro
  • 使用 FastCGI 运行 Lua 脚本

    我目前正在尝试找出使用 FastCGI 与 lighttpd 或 Nginx 一起运行 Lua 脚本的方法 我唯一能挖到的是WSAPI http keplerproject github com wsapi 开普勒计划的一部分 但我想知道是
  • kubernetes nginx ingress 无法将 HTTP 重定向到 HTTPS

    我有一个托管在 Google Cloud 平台中的网络应用程序 该应用程序位于负载均衡器后面 而负载均衡器本身位于入口后面 入口设置了 SSL 证书 并按预期接受 HTTPS 连接 但有一个问题 我无法让它将非 HTTPS 连接重定向到 H
  • Nginx - 自定义 404 页面

    Nginx PHP 在 fastCGI 上 对我来说非常有用 当我输入不存在的 PHP 文件的路径时 我不会得到默认的 404 错误页面 任何无效的 html 文件都会出现该错误页面 而只会得到 未指定输入文件 如何自定义此 404 错误页
  • nginx 反向代理 websocket

    nginx 现在支持代理 websockets 但我无法找到任何有关如何在没有单独的情况下执行此操作的信息location应用于使用 websocket 的 URI 的块 我见过一些人推荐这种方法的一些变体 location proxy h

随机推荐

  • 大端小端和C实现大小端字节序的转化

    大端小端 小端就是低位字节放在内存的低地址端 xff0c 高位字节放在内存的高地址端 大端就是高位字节放在内存的低地址端 xff0c 低位字节放在内存的高地址端 举一个例子 xff0c 比如数字0x12 34 56 78 xff08 注意7
  • 【计算机图形学/实时渲染】 阴影(GAMES202)

    阴影 对于静态的物体 xff0c 可以使用Lightmap烘焙的方法来获取物体的影子 xff08 静态阴影 xff09 xff0c 而对于动态的物体 xff0c 一般采用的是Shadowmap的技术 光照贴图 xff08 Lightmap
  • 解决Mingw-w64下载太慢问题

    官网下载太慢了 xff0c 我们只用换一个镜像源就可以 1 点击Problems Downloading 2 切换香港的
  • 嵌入式Linux开发8——UART串口通讯

    1 背景知识 1 1 UART通讯格式 串口全称叫做串行接口 xff0c 通常也叫做 COM 接口 xff0c 串行接口指的是数据一个一个的顺序传输 xff0c 通信线路简单 使用两条线即可实现双向通信 xff0c 一条用于发送 xff0c
  • 二叉树笔记

    二叉树 二叉搜索 xff08 排序 查找 xff09 树 二叉查找树 xff08 Binary Search Tree xff09 xff0c xff08 又 xff1a 二叉搜索树 xff0c 二叉排序树 xff09 它或者是一棵空树 x
  • C++面试常见题目

    C 43 43 面试常见题目 c 43 43 编译过程自动类型推导auto和decltype重载 重写 xff08 覆盖 xff09 和隐藏的区别C 43 43 构造函数和析构函数能调用虚函数吗volatile关键词运算符重载格式noexe
  • 计算机网络面试常问问题

    C 43 43 面试 计算机网络常见问题 计算机网络常见问题TCP IP协议笔记TCPTCP的特点及目的序列号与确认应答提高可靠性为什么是三次握手和四次挥手滑动窗口流量控制拥塞控制TCP粘包问题 httphttp和https的区别https
  • Trajectory generation for quadrotor while tracking a moving target in cluttered environment

    四旋翼在杂波环境下跟踪运动目标的轨迹生成 摘要1 文章主要贡献2 前言2 1 轨迹公式2 2 实现结构 3 跟踪轨迹生成3 1 标称路径点生成3 2 可行路径点生成3 3 安全飞行走廊生成3 4 代价函数3 5 强制约束3 6 求解跟踪轨迹
  • 翻译-Frustum PointNets for 3D Object Detection from RGB-D Data

    Frustum PointNets for 3D Object Detection from RGB D Data 摘要介绍相关工作从RGB D数据中检测三维物体基于前视图图像的方法 xff1a 基于鸟瞰图的方法 基于3D的方法 点云的深度
  • Online Trajectory Generation of a MAV for Chasing a Moving Target in 3D Dense Environments

    微型无人机的在线轨迹生成 xff0c 用于在3D密集环境中追踪运动目标 摘要一 介绍二 相关工作A 在障碍物环境中追逐B 通过预先规划安全地生成轨迹 三 问题陈述A 问题设置B 能力C 命名 IV 视点生成A 可见度指标B 具有安全性和可见
  • 配置目标跟踪开源项目traj_gen_vis踩过的坑

    项目地址 https github com icsl Jeon traj gen vis 安装依赖需注意的问题 traj gen with qpoases 需安装ros分支的代码 xff08 这个作者并没有指出 xff0c 坑 xff09
  • cmake arm-none-eabi-gcc for stm32 cpp project

    尝试把原有的stm32工程F1canBootloader用cmake来管理 xff0c 遇到了以下几个坑 xff1a 1 报错 xff0c undefined reference to 96 dso handle 39 CMakeFiles
  • 网络攻防之wireshark抓取登录信息

    使用wireshark抓取登录信息 简介 xff1a Wireshark xff08 前称Ethereal xff09 是一个网络封包分析软件 网络封包分析软件的功能是撷取网络封包 xff0c 并尽可能显示出最为详细的网络封包资料 Wire
  • 头文件互相包含所引发的的问题(深入剖析)

    今天写程序出现了一个让人蛋疼的错误 xff0c 后来发现是由于头文件互相包含所引起的 原本只是简单的以为头文件互相包含只会触发 xff0c 头文件的递归包含 即 xff0c A包含B xff0c 所以才A的头文件里会将B的头文件内容拷贝过来
  • C++11异步操作future和aysnc 、function和bind

    C 43 43 11异步操作future和aysnc function和bind 前言异步操作std future和std aysnc 介绍std future和std aysnc的使用Demostd packaged task 介绍std
  • C++文件服务器项目—FastDFS—1

    C 43 43 文件服务器项目 FastDFS 1 前言1 项目架构2 分布式文件系统2 1 传统文件系统2 2 分布式文件系统 3 FastDFS介绍3 1 fdfs概述3 2 fdfs框架中的三个角色3 3 fdfs三个角色之间的关系3
  • C++文件服务器项目—Redis—2

    C 43 43 文件服务器项目 Redis 2 前言1 数据库类型1 1 基本概念1 2 关系 非关系型数据库搭配使用 2 redis基础知识点2 1 redis安装2 2 redis中的两个角色2 3 redis中数据的组织格式2 4 r
  • C++文件服务器项目—Nginx—3

    C 43 43 文件服务器项目 Nginx 3 前言1 Nginx一些基本概念1 1 Nginx初步认识1 2 正向代理概念理解1 3 反向代理概念理解 2 Nginx的安装与配置2 1 Nginx与相关依赖库的安装2 2 Nginx相关的
  • C++文件服务器项目—FastCGI—4

    C 43 43 文件服务器项目 FastCGI 4 前言1 CGI 概念理解2 FastCGI 概念理解3 FastCGI和spawn fcgi安装4 FastCGI和 Nginx的关系5 Nginx数据转发 修改配置文件6 spawn f
  • C++文件服务器项目—Nginx+FastDFS插件—5

    C 43 43 文件服务器项目 Nginx 43 FastDFS插件 5 前言1 文件上传下载流程1 1 文件上传流程1 2 文件下载流程1 3 文件下载优化流程 2 Nginx和fastDFS插件2 1 安装Nginx和fastdfs n