分布式学习第五条 Nginx + FastDFS

该文介绍了如何通过nginx作为代理服务器,FastDFS执行上传下载操作来构建类似百度网盘的系统。配置过程中包括了文件上传下载流程、nginx与FastDFS的整合,以及遇到的错误和解决方案,如修改配置文件、添加模块、处理编译错误等。最终实现客户端通过HTTP协议直接访问存储节点下载文件的功能。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值