Nginx和FastDFS的整合

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、文件上传下载流程

  1. 文件上传流程

    在这里插入图片描述

  2. 文件下载流程

    在这里插入图片描述

  3. 优化

    优化思路:

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

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

        http://192.168.163.134/group1/M00/00/00/wKijhmVhmIqASb3LAANln4yMdPQ502.jpg

    在这里插入图片描述

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

    • fastDFS能不能解析http协议

    • nginx能解析http协议

      • 在nginx中安装fastDFS的插件
  2. 客户端怎么知道文件就存储在对应的那个存储节点上?

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

3、Nginx上部署FastDFS

注意:全部安装条件在确保之前的FastDFS 的tracker、storage和client可以正常使用。

安装包名称:fastdfs-nginx-module_v1.16.tar.gz

安装步骤:

  1. 解压Nginx的FastDFS模块包:tar -xzvf fastdfs-nginx-module_v1.16.tar.gz

    cd fastdfs-nginx-module/

    会发现里面有个INSTALL、HISTORY 和 src目录,这个不需要make而是需要重新编译一下storage的Nginx模块。

    在这里插入图片描述

  2. 在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 即可

  3. 安装成功后, 启动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
    
    
  4. 拷贝完成之后,需要修改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 
    
  5. 修改完配置文件后重新启动 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
    
  6. 再次重启Nginx,发现 worker 进程终于启动了

    在这里插入图片描述

  7. 测试

    启动FastDFS的 tracker 和 storage 守护进程,然后上传一个本地图片用于浏览器进行下载

    在这里插入图片描述

    文件id:group1/M00/00/00/wKijhmVhmIqASb3LAANln4yMdPQ502.jpg

  8. 打开浏览器,输入: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
    
  9. 再次访问浏览器,如果得到图片显示,则表示storage已经成功配置Nginx服务。

    在这里插入图片描述

storage服务器的 ip 地址可通过“fdfs_file_info”获取

fdfs_file_info /etc/fdfs/client.conf /group1/M00/00/00/wKj3h1vJSOqAM6RHAAvqH_kipG8229.jpg

在这里插入图片描述

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FastDFS 是一个开源的轻量级分布式文件系统,它可以提供高性能的文件存储和访问服务。而 Nginx 是一个高性能的 Web 服务器和反向代理服务器,它可以用来加速静态文件的访问和负载均衡。 将 FastDFS 整合Nginx 中,可以通过 Nginx 提供的访问控制和负载均衡机制,提高 FastDFS 的性能和可靠性。 以下是 FastDFS 整合 Nginx 的步骤: 1. 安装 FastDFSNginx 在安装 FastDFSNginx 之前,需要确保系统已经安装了 libfastcommon 和 pcre 库。 安装 FastDFS 包括 tracker 和 storage 两个组件,可以通过以下命令进行安装: ``` wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz tar -zxvf V5.11.tar.gz cd fastdfs-5.11/ ./make.sh ./make.sh install ``` 安装 Nginx 可以通过以下命令进行安装: ``` wget https://nginx.org/download/nginx-1.20.0.tar.gz tar -zxvf nginx-1.20.0.tar.gz cd nginx-1.20.0/ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module make make install ``` 2. 配置 FastDFS 配置 FastDFS 的时候,需要修改 tracker 和 storage 的配置文件,使其能够正常工作。 tracker 的配置文件路径为 /etc/fdfs/tracker.conf,可以通过以下命令进行修改: ``` vi /etc/fdfs/tracker.conf ``` 修改 tracker_server 配置项,将其设置为本机IP地址,例如: ``` tracker_server=192.168.1.100:22122 ``` storage 的配置文件路径为 /etc/fdfs/storage.conf,可以通过以下命令进行修改: ``` vi /etc/fdfs/storage.conf ``` 修改 tracker_server、store_path0 和 base_path 配置项,将其设置为本机IP地址和存储路径,例如: ``` tracker_server=192.168.1.100:22122 store_path0=/data/fastdfs/storage base_path=/data/fastdfs ``` 3. 配置 Nginx 配置 Nginx 的时候,需要修改 nginx.conf 配置文件,使其能够正常工作。 nginx.conf 的路径为 /usr/local/nginx/conf/nginx.conf,可以通过以下命令进行修改: ``` vi /usr/local/nginx/conf/nginx.conf ``` 在 http 配置段中添加以下配置: ``` http { ... # fastdfs 配置 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_intercept_errors on; fastcgi_pass_header Server; fastcgi_hide_header X-Powered-By; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # fastdfs 分组和文件id参数 fastcgi_param FILE_GROUP $arg_group_name; fastcgi_param FILE_ID $arg_file_id; # fastdfs 路径 fastcgi_param FASTCGI_SCRIPT_NAME /fastdfs; fastcgi_param FASTCGI_DOCUMENT_ROOT /usr/local/nginx/html; } ``` 在 server 配置段中添加以下配置: ``` server { ... location /group1/M00 { ngx_fastdfs_module; } } ``` 其中,/group1/M00 是 FastDFS 中默认的组名和存储路径,可以根据实际情况进行修改。 4. 启动 FastDFSNginx 启动 FastDFSNginx 可以通过以下命令进行启动: ``` /etc/init.d/fdfs_trackerd start # 启动 tracker /etc/init.d/fdfs_storaged start # 启动 storage /usr/local/nginx/sbin/nginx # 启动 nginx ``` 启动成功后,可以通过访问 http://localhost/group1/M00/test.jpg 来测试是否能够正常访问 FastDFS 中的文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值