1、为什么需要整合FastDFS和Nginx
一个好的分布式文件系统最好提供Nginx的模块,因为对于互联网应用来说,像文件这种静态资源,一般是通过HTTP的下载,此时通过容易扩展的Nginx来访问FastDFS,能够让文件的上传和下载变得特别简单。
Nginx安装FastDFS模块,主要是安装在FastDFS的存储服务器(storage)上,而不是tracker和client上。
目的实际是为了,当输入地址(其中192.168.163.134 是一个storage服务器):
http://192.168.163.134/group1/M00/00/00/wKijhmVhmIqASb3LAANln4yMdPQ502.jpg
能够通过Nginx的Web服务功能,直接返回图片。
下面我们结合文件上传下载的例子来看:
2、文件上传下载流程
-
文件上传流程
-
文件下载流程
-
优化
优化思路:
-
-
直接让客户端连接fastDFS的存储节点, 实现文件下载
-
举例, 访问一个url直接下载:
http://192.168.163.134/group1/M00/00/00/wKijhmVhmIqASb3LAANln4yMdPQ502.jpg
-
-
客户端发送请求使用的协议: http
fastDFS能不能解析http协议
nginx能解析http协议
- 在nginx中安装fastDFS的插件
客户端怎么知道文件就存储在对应的那个存储节点上?
- 上传的时候将fileID和存储节点IP地址都进行存储
3、Nginx上部署FastDFS
注意:全部安装条件在确保之前的FastDFS 的tracker、storage和client可以正常使用。
安装包名称:fastdfs-nginx-module_v1.16.tar.gz
安装步骤:
-
解压Nginx的FastDFS模块包:tar -xzvf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module/
会发现里面有个INSTALL、HISTORY 和 src目录,这个不需要make而是需要重新编译一下storage的Nginx模块。
-
在FastDFS的存储节点上安装Nginx, 将软件安装包拷贝到fastDFS存储节点对应的主机上
# 1. 找fastDFS的存储节点 # 2. 在存储节点对应的主机上安装Nginx, 安装的时候需要一并将插件装上 # - (余庆提供插件的代码 + nginx的源代码 ) * 交叉编译 = Nginx
由于我们之前在这台主机上安装过Nginx,而且也是这台主机作为存储节点,所以直接进入Nginx源码安装目录,进行如下操作即可:
cd nginx-1.10.1/ ./configure --add-module=/home/user/soft/nginx-fastdfs-module/fastdfs-nginx-module/src
其中/usr/local/src/fastdfs-nginx-module/src 是刚才解压的fastdfs模块的绝对路径,就是在编译Nginx时候,连同这个模块一起编译:
make sudo make install
make中遇到的问题
这种问题我们进入objs目录,将Makefile里的 -Werror 去掉即可
然后再次执行make就遇到了如下问题
原因是Nginx是会想/usr/local/include/fastdfs/去找, 而不是去/usr/include/fastdfs/去找
解决方案1:
#将/usr/include/fastdfs/ 和 /usr/include/fastcommon/ 两个文件夹拷贝到/usr/local/include/下即可 sudo cp /usr/include/fastdfs/ /usr/local/include/ -R sudo cp /usr/include/fastcommon/ /usr/local/include/ -R
解决方案2:
# 修改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/
添加完成后,再次make,遇到同样的问题
我们修改 objs/Makefile文件
再次执行make就成功了,然后再使用 sudo make install 即可
-
安装成功后, 启动Nginx, 发现没有 worker进程
我们进入 /usr/local/nginx/logs 查看 nginx 的error.log日志,找错误原因:
原来是找不到插件里的mod_fastdf.conf配置文件
所以我们需要将该文件拷贝到 /etc/fdfs目录下
# [2023-11-25 14:09:05] ERROR - file: shared_func.c, line: 968, file /etc/fdfs/mod_fastdfs.conf not exist # 从哪儿找 -> fastDFS插件目录中找 user@user-virtual-machine:~/soft/nginx-fastdfs-module/fastdfs-nginx-module$ tree . ├── HISTORY ├── INSTALL └── src ├── common.c ├── common.h ├── config ├── mod_fastdfs.conf ->将该文件 sudo cp mod_fastdfs.conf /etc/fdfs └── ngx_http_fastdfs_module.c 1 directory, 7 files
-
拷贝完成之后,需要修改mod_fdfs.conf文件, 根据当前存储节点的storage.conf进行修改
# 存储log日志的目录 base_path=/home/user/fastdfs/storage # 连接tracker地址信息 tracker_server=192.168.163.134:22122 # 存储节点绑定的端口 storage_server_port=23000 # 当前存储节点所属的组 group_name=group1 # 客户端下载文件的时候, 这个下载的url中是不是包含组的名字 // 上传的fileID: group1/M00/00/00/wKijhmVhmIqASb3LAANln4yMdPQ502.jpg // 完整的url: http://192.168.163.134/group1/M00/00/00/wKijhmVhmIqASb3LAANln4yMdPQ502.jpg url_have_group_name = true # 存储节点上存储路径的个数 store_path_count=1 # 存储路径的详细信息 store_path0=/home/user/fastdfs/storage
-
修改完配置文件后重新启动 Nginx, 还是没有worker进程, 查看error.log日志
还是同样的问题,我们需要找到 http.conf文件,然后再拷贝到 /etc/fdfs 目录即可
# [2023-11-25 14:26:02] 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 # 重新启动 Nginx,发现还是没有 worker进程,再次查看error.log日志: # [2023-11-25 14:32:18] ERROR - file: shared_func.c, line: 968, file /etc/fdfs/mime.types not exist - 从nginx的源码安装包中找/conf - sudo cp mime.types /etc/fdfs
-
再次重启Nginx,发现 worker 进程终于启动了
-
测试
启动FastDFS的 tracker 和 storage 守护进程,然后上传一个本地图片用于浏览器进行下载
文件id:group1/M00/00/00/wKijhmVhmIqASb3LAANln4yMdPQ502.jpg
-
打开浏览器,输入:http://192.168.163.134/group1/M00/00/00/wKijhmVhmIqASb3LAANln4yMdPQ502.jpg
# 错误信息 #2023/11/25 14:51:50 [error] 6861#0: *2 open() "/usr/local/nginx/zyFile2/favicon.ico" failed (2: No such file or directory), client: 192.168.163.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.163.134", referrer: "http://192.168.163.134/upload/" # 错误原因 服务器在查找资源时候, 找的位置不对, 需要给服务器指定一个正确的位置, 如何指定? - 资源在哪? 在存储节点的存储目录中 store_path0 - 如何告诉服务器资源在这? 在服务器端添加location处理 locatioin /group1/M00/00/00/wKj3h1vJSOqAM6RHAAvqH_kipG8229.jpg location /group1/M00/00/00/ location /group1/M00/ # 在 /usr/local/nginx/conf/nginx.conf 配置文件中配置如下 location 处理 location /group1/M00/ { # 告诉服务器资源的位置 root /home/user/fastdfs/storage/data; ngx_fastdfs_module; } # 重新启动 nginx sudo nginx -s reload # 会出现下面一条命令,表示插件模块的一个进程 ngx_http_fastdfs_set pid=6961
-
再次访问浏览器,如果得到图片显示,则表示storage已经成功配置Nginx服务。
storage服务器的 ip 地址可通过“fdfs_file_info”获取
fdfs_file_info /etc/fdfs/client.conf /group1/M00/00/00/wKj3h1vJSOqAM6RHAAvqH_kipG8229.jpg