分布式学习第五条 Nginx + FastDFS

news2024/11/17 1:56:55

使用nginx和FastDFS可以实现下载,类似百度网盘,需要对环境进行配置,nginx作为代理服务器,fastDFS负责执行上传下载操作。

1. 文件上传下载流程

文件上传流程

 

文件下载流程

优化

优化思路:

    • 直接让客户端连接fastDFS的存储节点, 实现文件下载

    • 举例, 访问一个url直接下载:

http://192.168.247.147/group1/M00/00/00/wKj3k1tMBKuARhwBAAvea_OGt2M471.jpg

 

客户端发送请求使用的协议: http

fastDFS能不能解析http协议

nginx能解析http协议

在nginx中安装fastDFS的插件

客户端怎么知道文件就存储在对应的那个存储节点上?

上传的时候将fileID和存储节点IP地址都进行存储

2. Nginx和fastDFS的整合

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

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

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

- fastdfs-nginx-module_v1.16.tar.gz 解压缩
# 1. 进入nginx的源码安装目录 /home/liu/test3/分布式编程/day03/nginx-1.10.1
# 2. 检测环境, 生成makefile
# pwd查看路径  /home/liu/test3/分布式编程/day01/fastdfs-nginx-module/src
./configure --add-module=fastdfs插件的源码目录/src
./configure --add-module=/home/liu/test3/分布式编程/day01/fastdfs-nginx-module/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

# 3.src/core/ngx_murmurhash.c: In function ‘ngx_murmur_hash2’:
# src/core/ngx_murmurhash.c:37:11: error: this statement may fall through [-# Werror=implicit-fallthrough=]
      #    h ^= data[2] << 16;
      #    ~~^~~~~~~~~~~~~~~~
#解决方法是删除 objs/makefile第一行中的 CFLAGS的 -Werror,再重新make
      

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/
    

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

robin@OS:/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

找nginx的logs日志'

# 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文件, 参数当前存储节点的storage.conf进行修改

# 存储log日志的目录
base_path=/home/liu/fastdfs/storage
# 连接tracker地址信息 跟存储节点一样的
tracker_server=192.168.254.128:22122
# 存储节点绑定的端口
storage_server_port=23000
# 当前存储节点所属的组
group_name=group1
# 客户端下载文件的时候, 这个下载的url中是不是包含组的名字 只有一个组的时候可以false
// 上传的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/liu/fastdfs/storage

重写启动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
# ERROR - file: shared_func.c, line: 968, file /etc/fdfs/mime.types not exist
	- 从nginx的源码安装包中找/conf
	- sudo cp mime.types /etc/fdfs

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

group1/M00/00/00/wKj-gGSYOxuAB5X8AAG5Br0kW3Y236.png
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; /home/liu/fastdfs/storage/data
	ngx_fastdfs_module;
}
sudo nginx -s reload

#使用正则表达式可以配置


#启动fastdfs
fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf) 
fdfs_storaged 存储节点的配置文件(/etc/fdfs/storage.conf)
fdfs_upload_file 客户端的配置文件(/etc/fdfs/client.conf) 要上传的文件

#启动nginx
sudo nginx

//浏览器访问就可以访问了
http://192.168.248.128/group1/M00/00/00/wKj-gGSYOxuAB5X8AAG5Br0kW3Y236.png
访问的时候就可以下载了 因为配置了fastDFS 可对资源文件进行下载

复习

  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/711802.html

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

相关文章

Flutter之 Bloc实战实现购物车功能

Flutter之 Bloc实现购物车功能 前言商品列表模块状态设置UI设计业务逻辑测试代码购物车模块状态设置业务逻辑UI设计加入购物车测试代码参考资料前言 本篇以官方购物车项目为例,说明Bloc在Flutter的应用。该项目很简单,就两个模块,一个是商品列表页面模块catalog,一个是购物…

使用gradio库的File模块实现文件上传和展示

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

MATLAB迭代

目录 黄金分割比 习题 符号运算 固定点 WHY hello world Goldrect 黄金分割比 format for循环 %% For loopx 42for k 1:12x sqrt(1x);disp(x)end while循环 %% While loopx 42;k 1;while abs(x-sqrt(1x)) > 5e-5x sqrt(1x);k k1;endk 绘图语句 %% Plotx -pi:…

现在的前端,到底是技术深度重要,还是技术广度重要?

前言 大家好&#xff0c;&#xff0c;用最通俗易懂的话讲最难的知识点是我的座右铭&#xff0c;基础是进阶的前提是我的初心。 前几天跟朋友讨论“技术广度和技术深度哪个重要”&#xff0c;再想想自己像过山车一般的前端历程&#xff0c;有感而发&#xff0c;想给小兄弟们一…

简单的学习下 JavaScript 录屏API

学习如何使用这个简单易用的API进行屏幕共享、屏幕录制等操作。尽管需要对JavaScript有一定的了解&#xff0c;但我相信你已经具备了这方面的知识。 1、开始录制 让我们创建一个按钮&#xff1a; <button id"recording-toggle">Start recording</button>…

BUUCTF变异凯撒

根据题目可以得知&#xff0c;这道题使用的是凯撒密码 凯撒密码&#xff0c;是一种位移加密方式&#xff0c;只对26个字母进行位移替换加密&#xff0c;规则简单&#xff0c;容易破解。 但是根据题目下发的文件看来&#xff0c;出现了关于除字母以外的字符&#xff0c;结合题目…

综合评价算法 | Matlab实现基于变异系数法的综合评价算法

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 综合评价算法 | Matlab实现基于变异系数法的综合评价算法 研究内容 变异系数法是根据统计学方法计算得出系统各指标变化程度的方法,是一种客观赋权法。根据该方法变化差异较大的指标权重较大,变化差异较…

【C++ 实现】图论概念,最小生成树,单/多源最短路径实现

文章目录 数据结构表示图最小生成树KruskalPrim 最短路径DijkstraBellman-Ford算法多源最短路径&#xff1a;FloydWarshall 总结 数据结构表示图 首先节点的存取&#xff0c;V是节点key&#xff0c;vector<pair<V,V>> map;其实已经能表达一个图了&#xff0c;但是…

MWCS 2023,到底有些啥?(上篇)

大家好&#xff0c;MWCS 2023&#xff08;世界移动通信大会上海展&#xff09;已经结束了。按照老规矩&#xff0c;我来给大家汇报一下现场情况。 █ 展会总结 今年是MWC在中国的第十届&#xff0c;也是疫情管控解除后的第一届。从总体情况来看&#xff0c;人气非常火爆。展区人…

ElasticSearch - 根据经纬度,简单搜索指定距离范围内的数据

ES的地图检索方式 ES支持的地图检索方式有以下几种&#xff1b; geo_distance geo_bounding_box geo_polygon 1、geo_distance&#xff1a;直线距离检索&#xff0c;如给定点A&#xff0c;要求返回地图上距离点A三千米的商家&#xff08;点外卖场景&#xff09; 2、查找索引…

下半年就该这么干!

阅读本文大概需要 0.99 分钟。 周末一般不更新&#xff0c;不过今天有点特殊。 是这样的&#xff0c;前几天不是通知说我们 7 月 8 日会在杭州举办线下大会么&#xff1f;完了之后发现后台很多私信问怎么参加的&#xff0c;这才想起我这个公众号还没发让大家进预约群的入口。。…

前端使用mysql记录。以本机作为服务器,安装mySql。Dbeaver的基本使用

安装 Mac 上如何安装Mysql&#xff1f; Mac 上如何安装Mysql&#xff1f; Mysql 配置 在mac终端打开文件&#xff1a;vi ~/.bash_profile 加入语句&#xff1a;PATH$PATH:/usr/local/mysql/bin 使配置的语句生效&#xff1a;source ~/.bash_profile 使用命令行 sudo vi /et…

【读书笔记】《月亮与六便士》- [英] 威廉·萨默塞特·毛姆 - 1919年出版

不停的阅读&#xff0c;然后形成自己的知识体系。 2023.07.03 读 一直听说毛姆的大名&#xff0c;却一直没有拜读。记得《小王子》中有读者提到这本书&#xff0c;看了眼作者竟然发现是毛姆。那么毫不犹豫的&#xff0c;赶紧拜读一番。 文章目录 作家榜推荐词第一章第二章第三…

Spring核心原理解析

1.Bean的生命周期底层原理 AppConfig package com.zhouyu;import com.zhouyu.service.OrderService; import org.springframework.context.annotation.*;ComponentScan("com.zhouyu") public class AppConfig {Beanpublic OrderService orderService1(){return new…

微机实验一:认识实验系统和联机通讯实验

实验目的 讲清楚进行本实验后要学到的知识、掌握的数据结构及共定义和农示方法&#xff0c;讲清楚所采用的算法 wrTPL-486微机原理及接口技术数学实验手统的操u)孰秀TPC-480联机集闯开发调试故件的操作环境3)3俩文丝计体机的基阻成和4、存储器并有接新i的置(了解岗单汇海语谢设…

Nginx【location指令、虚拟主机的分类、Nginx支持三种类型的虚拟主机配置 】(三)-全面详解(学习总结---从入门到深化)

目录 Nginx配置指令详解_location指令 虚拟主机的分类 Nginx支持三种类型的虚拟主机配置 Nginx配置指令详解_location指令 配置location块 语法&#xff1a; URL // http://ip:port/ location [ | ~ | ~* | ^~] uri {... } 示例1 没有修饰符 表示&#xff1a;必须以指…

UE5 MetaHuman SDK插件的使用【二、聊天机器人】

目录 制作&#xff1a; 流程制作【相对复杂但逻辑清楚】&#xff1a; 快速制作【有个函数把上面的流程全部合在了一起&#xff0c;只需要用一个函数即可】 3个结构体的参数 combo后面的逻辑&#xff1a; 效果&#xff1a; ​编辑 代码 在前面的文章中&#xff0c;我们创…

geoserver发布arcgis server离线瓦片

1.使用tif文件也可以发布服务&#xff0c;但是我下载的tif文件发布的服务总数模糊不清&#xff0c;原因可能是地图比例尺问题。 2.仔细研究&#xff0c;发现下载的arcgis server瓦片都是高清的&#xff0c;于是想到直接加载arcgis瓦片&#xff0c;这样图片/坐标系之间问题都完…

Python3 实例(四) | 菜鸟教程(二十二)

目录 一、Python 堆排序 二、Python 计数排序 三、Python 希尔排序 四、Python 拓扑排序 五、Python 简单的银行系统 一、Python 堆排序 &#xff08;一&#xff09;堆排序&#xff08;Heapsort&#xff09;是指利用堆这种数据结构所设计的一种排序算法。 &#xff08;二…

【JUC-6】AQS介绍,基于AQS实现自己的锁

什么是AQS AbstractQueuedSynchronizer(抽象队列同步器&#xff0c;简称AQS)出现在JDK 1.5中。AQS是很多同步器的基础框架&#xff0c;比如ReentrantLock、CountDownLatch和Semaphore等都是基于AQS实现的。除此之外&#xff0c;我们还可以基于AQS&#xff0c;定制出我们所需要…