FastDFS

linux安装部署FastDFS

安装fastDFS需要分别安装fastdfs-nginx-module,fastdfs,nginx,libfastcommon
网上有下载,注意版本的搭配
在这里插入图片描述
1、安装gcc(编译时需要)

yum install -y gcc gcc-c++

2、安装libevent (运行时需要

yum -y install libevent

3、安装创建目录上传文件
参考:

mkdir -p /fileservice/fast
cd /fileservice/fast

在这里插入图片描述
4、安装libfastcommon

  • 解压文件:tar -zxvf libfastcommon-1.0.35.tar.gz
  • 进入libfast文件目录:cd libfastcommon-1.0.35
  • 执行编译:./make.sh
  • 安装:./make.sh install

5、安装fastdfs

  1. 官方下载地址
    https://sourceforge.net/projects/fastdfs/files/下载很慢
  2. 安装相关依赖库
    yum install perl
    yum install pcre
    yum install pcre-devel
    yum install zlib
    yum install zlib-devel
    yum install openssl
    yum install openssl-devel
  3. 安装fastdfs
    解压文件:tar -zxvf fastdfs-5.11.tar.gz
    进入解压后的目录:cd fastdfs-5.11
    执行编译:./make.sh
    安装:./make.sh install
  4. 查看tracker 和 storage的可执行脚本
    ll /etc/init.d/ grep fdfs
    在这里插入图片描述
  5. 准备配置文件 默认在/etc/fdfs/下面
    cd /etc/fdfs
    在这里插入图片描述
    先把配置文件名中的sample去了。建议复制一份。
    cp client.conf.sample client.conf
    cp storage.conf.sample storage.conf
    cp storage_ids.conf.sample storage_ids.conf
    cp tracker.conf.sample tracker.conf
    在这里插入图片描述
    然后修改tracker的存放数据和日志的目录。
    mkdir -p /home/fastdfs/tracker

6、配置和启动tracker

  1. 切换到目录到:/etc/fdfs/ 目录下;
  2. 修改tracker.conf
    vim tracker.conf
    base_path=/home/yuqing/fastdfs 改为:
    在这里插入图片描述
  3. 启动tracker,运行如下命令:
    service fdfs_trackerd start
    在这里插入图片描述
    注意:在/home/fastdfs/tracker 目录下生成两个目录, 一个是数据,一个是日志;
    在这里插入图片描述

7、配置和启动storage

  1. 切换目录到: /etc/fdfs/ 目录下;

  2. 修改storage.conf
    vi storage.conf
    在这里插入图片描述
    base_path=/home/yuqing/fastdfs 改为:
    base_path=/home/fastdfs/storage
    在这里插入图片描述
    store存放文件的位置(store_path)
    store_path0=/home/yuqing/fastdfs 改为:
    store_path0=/home/fastdfs/storage
    在这里插入图片描述
    如果有多个挂载磁盘则定义多个store_path,如下
    store_path1=…
    store_path2=…
    配置tracker服务器:IP
    tracker_server=192.168.59.128:22122
    在这里插入图片描述

  3. 创建/home/fastdfs/storage 目录
    mkdir -p /home/fastdfs/storage
    在这里插入图片描述

  4. 启动storage, 运行命令如下:
    service fdfs_storaged start
    在这里插入图片描述
    启动完成后进入 /home/fastdfs/storage/data 目录下,显示目录如下:
    在这里插入图片描述

8、使用FastDFS自带工具测试

  1. 切换目录到 /etc/fdfs/ 目录下;
    cd /etc/fdfs
  2. 修改client.conf ; vi client.conf
    修改基本路径和tracker_server如下:
    在这里插入图片描述
    注意:若tracker有多个,可以配置多个,如下:
      tracker_server=…
      tracker_server=…
  3. 拷贝一张图片到Centos服务器上的/etc/fdfs目录下;
    在这里插入图片描述
  4. 进行测试
    运行如下(运行测试程序,读取/etc/fdfs/client.conf 文件,上传/etc/fdfs目录下的lol.png文件)
    /usr/bin/fdfs_upload_file ./client.conf ./lol.png在这里插入图片描述
    以上图中的文件地址:http://192.168.59.128/group1/M00/00/00/wKg7gF5w8a6ASQ9bAAy9bu9NQiQ753.png 对应storage服务器上的/home/leige/fastdfs/storage/data/00/00/M00/00/00/wKg7gF5w8a6ASQ9bAAy9bu9NQiQ753.png文件;
    由于现在还没有和nginx整合无法使用http下载。
    在这里插入图片描述

9、FastDFS 和nginx整合

  1. 在tracker上安装 nginx在每个tracker上安装nginx,的主要目的是做负载均衡及实现高可用。如果只有一台tracker可以不配置nginx。

    一个tracker对应多个storage,通过nginx对storage负载均衡

  2. 在storage 上安装nginx

    1. 上传fastdfs-nginx-module-1.20.tar.gz 到Centos服务器上

    2. 解压fastdfs-nginx-module-1.20.tar.gz ;
      tar -zxvf fastdfs-nginx-module-1.20.tar.gz

    3. 切换目录到: fastdfs-nginx-module-1.20/src 目录下

    4. cd fastdfs-nginx-module-1.20/src4.修改config文件,将文件中的所有 /usr/local/ 路径改为 /usr/
      修改之后
      在这里插入图片描述

    5. 将fastdfs-nginx-module/src下的mod_fastdfs.conf拷贝至/etc/fdfs/下

      cp mod_fastdfs.conf /etc/fdfs/

    6. 并修改 /etc/fdfs/mod_fastdfs.conf 的内容;
      vi /etc/fdfs/mod_fastdfs.conf

      类容如下:
      tracker_server=192.168.59.128:22122
      tracker_server=192.168.172.20:22122 #(多个tracker配置多行)

      在这里插入图片描述

      url_have_group_name=true #url中包含group名称
      在这里插入图片描述
      store_path0=/home/fdfs_storage #指定文件存储路径(上面配置的store路径)
      在这里插入图片描述

    3.进入之前解压的fastdfs目录下,把http.conf、mime.conf移动至/etc/fdfs

    cp http.conf mime.types /etc/fdfs/
    在这里插入图片描述

10、Nginx的安装

  1. 上传 nginx-1.15.2.tar.gz 到Centos服务器上;

  2. 解压 nginx-1.15.2.tar.gz
    tar -zxvf nginx-1.15.2.tar.gz

  3. 进入nginx解压的目录下
    cd nginx-1.15.2/

  4. 加入模块命令配置
    ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/fileservice/fast/fastdfs-nginx-module-1.20/src
    在这里插入图片描述

  5. 编译并安装
    make && make install

  6. 修改nginx配置

    cd /opt/nginx/conf

    vim nginx.conf
    在这里插入图片描述

  7. 启动nginx
    cd /usr/bin/
    ./nginx #启动

11、在浏览器中访问上传到fastDFS的图片

因为Centos系统有防火墙,需要先关闭掉,才可以在浏览器中访问;
1、CentOS7.0默认使用的是firewall作为防火墙;若没有启用iptables 作为防火墙,则使用以下方式关闭防火墙:
systemctl stop firewalld.service #停止firewall

systemctl disable firewalld.service #禁止firewall开机启动

firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

2、若已经启用iptables作为防火墙,则使用以下方式关闭:

service iptables stop #临时关闭防火墙

chkconfig iptables off #永久关闭防火墙

3、在谷歌浏览器中访问刚才上传的图片:

刚才上传的图片地址为:
http://192.168.59.128/group1/M00/00/00/wKg7gF5w8a6ASQ9bAAy9bu9NQiQ753.png
在这里插入图片描述

使用Docker搭建

1、下载FastDFS 镜像

docker pull delron/fastdfs

2、查看下载好的镜像

docker images

在这里插入图片描述

3、然后使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用),这里tracker服务将会自动映射到宿主机上

docker run -d --network=host --name tracker -v /home/fastdfsDoc/tracker:/var/fdfs delron/fastdfs tracker

在这里插入图片描述

4、使用docker镜像构建storage容器(存储服务器,提供容量和备份服务),这里storage容器需要依赖tracker服务,传入你的tracker服务的ip地址,端口默认是22122,ip地址也就是你宿主机的ip

docker run -d --network=host --name storage -e TRACKER_SERVER=192.168.59.128:22122 -v /home/fastdfsDoc/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage

在这里插入图片描述

5、配置nginx监听端口
a、启动nginx,这里nginx映射到宿主机上

docker run -it --name=myNginx -v /home/fastdfsDoc/nginx:/etc/nginx -p 80:80 nginx

b、修改
在这里插入图片描述

6、上传测试
首先将一张照片lol.png放置在宿主机/home/fatsdfsDoc/storage目录下,然后我们进入storage容器里面,运行下面命令:
在这里插入图片描述

1、进入容器命令

docker exec -it 97fc6e9d7dbb /bin/bash   

2、运行测试程序,读取/etc/fdfs/client.conf 文件,上传/home/fastdfsDoc/sotraeg目录下的lol.png文件

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf lol.png

在这里插入图片描述
通过url 进行访问
在这里插入图片描述

java代码上传

1、创建项目导入pom依赖

<dependency>
      <groupId>net.oschina.zcx7878</groupId>
      <artifactId>fastdfs-client-java</artifactId>
      <version>1.27.0.0</version>
    </dependency>
    <!-- spring-core -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.3.25.RELEASE</version>
    </dependency>

2、创建fdfs_client.conf

# 连接超时时间
connect_timeout=30
# 网咯连接超时时间
network_timeout=60
# 在宿主机中的位置
base_path=/home/fastdfsDoc/storage
# 服务器IP 地址
tracker_server = 192.168.59.128:22122

log_level=info

use_connection_pool = false

connection_pool_max_idle_time = 3600

load_fdfs_parameters_from_tracker=false

use_storage_id = false

storage_ids_filename = storage_ids.conf

http.tracker_server_port=80

3、测试类进行文件上传

package com.hyf;

import org.csource.fastdfs.*;
import org.springframework.core.io.ClassPathResource;

import java.io.IOException;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args ) throws Exception {
        // 需要上传的本机文件地址
       String uploadFilePath = "E:/images/stationmaster_img.png";
       // 获取配置文件绝对路径
       String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();

       // 1、加载配置文件,配置文件中的类容就是tracker 服务的地址
        ClientGlobal.init(filePath);
       // 2、创建一个 TrackerClient 对象。直接 new 一个
        TrackerClient trackerClient = new TrackerClient();
        // 3、使用TrackerClient 对象创建连接,获得 Tracker 对象
        TrackerServer trackerServer = trackerClient.getConnection();
        // 4、创建一个 storageServer 的引用,值为 null
        StorageServer storageServer = null;
        // 5、创建一个StorageClient 对象,需要2个参数对象,StorageServer 的引用
        StorageClient storageClient = new StorageClient(trackerServer, storageServer);
        // 6、使用 StorageClinet 对象传送图片
        String [] strings = storageClient.upload_file(uploadFilePath,"png",null);
        // 7、返回数组。包含组名和图片的路径。
        for (String string : strings) {
            System.out.println(string);
        }
        System.out.println("上传完成");

    }
}

结果:
在这里插入图片描述
在这里插入图片描述

springBoot文件上传一(不推荐使用,但需要知道这种方式)

1、创建springBoot 过程导入相关的 pom 依赖

<dependency>
            <groupId>net.oschina.zcx7878</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

2、配置yml文件

fastdfs:
  connect_timeout_in_seconds: 100
  network_timeout_in_seconds: 100
  charset: UTF-8
  tracker_services: 192.168.59.128:22122 # 如果需要骗子多个就用 , 隔开

3、创建UploadService

  • 初始化 fastDFS 的环境,和上传代码
package com.hyf.fastdfsspringboot1.utils;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.csource.common.MyException;
import org.csource.fastdfs.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2020-03-18 23:57
 * <p>
 * connect_timeout_in_seconds: 100
 * network_timeout_in_seconds: 100
 * charset: UTF-8
 * tracker_services
 */
@Component
public class UploadService {
    // IP 地址
    @Value("${fastdfs.tracker_services}")
    private String tracker_services;

    @Value("${fastdfs.connect_timeout_in_seconds}")
    private int connect_timeout_in_seconds;

    @Value("${fastdfs.network_timeout_in_seconds}")
    private int network_timeout_in_seconds;

    @Value("${fastdfs.charset}")
    private String charset;


    public Map<String, Object> upload(MultipartFile multipartFile) {
        if (multipartFile == null) {
            throw new RuntimeException("文件不能为空");
        }
        // 上传到 fastDFS,返回 id
        String fileId = this.fdfsUpload(multipartFile);
        if (StringUtils.isEmpty(fileId)) {
            System.out.println("上传失败");
            throw new RuntimeException("上传失败");
        }

        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "上传成功");
        map.put("code", fileId);  // 文件地址
        return map;
    }

    /**
     * 上传至 fastDFS
     * @param multipartFile
     */
    private String fdfsUpload(MultipartFile multipartFile) {
        // 初始化环境
        initFdfsConfig();
        //  直接 new 一个 trackerClient
        TrackerClient trackerClient = new TrackerClient();
        try {
            // 使用TrackerClient 创建连接对象Connection ,获得TrackerService 对象
            TrackerServer trackerServer = trackerClient.getConnection();
            // 获取到 StorageService 服务
            StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
            // 获取到 StorageClient
            StorageClient1 storageClient1 = new StorageClient1(trackerServer, storageServer);
            // 文件上传
              //获得文件扩展名
            String originalFilename = multipartFile.getOriginalFilename();
              // 截取到该文件是以 .什么结尾
            String substring = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
              // 上传
            String fileId = storageClient1.upload_appender_file1(multipartFile.getBytes(), substring, null);
            return fileId;
        } catch (Exception e) {
            System.out.println();
            return null;
        }
    }

    /**
     * 初始化 fastDFS 的环境
     */
    public void initFdfsConfig() {
        try {
            ClientGlobal.initByTrackers(tracker_services);
            ClientGlobal.setG_connect_timeout(connect_timeout_in_seconds);
            ClientGlobal.setG_network_timeout(network_timeout_in_seconds);
            ClientGlobal.setG_charset(charset);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
}

4、controller

package com.hyf.fastdfsspringboot1.controller;

import com.hyf.fastdfsspringboot1.utils.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2020-03-19 0:29
 */
@RestController
@RequestMapping("upload")
public class UploadController {

    @Autowired
    private UploadService uploadService;

    /*
    * 文件上传
    * */
    @RequestMapping("doUpload")
    public Map<String,Object> doUpload(MultipartFile mf){
        Map<String, Object> upload = uploadService.upload(mf);
        return  upload;
    }
}

5、index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<hr>
<form action="/upload/doUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="mf">
    <input type="submit" value="上传">
</form>
</body>
</html>

上传文件得到该返回的 json
在这里插入图片描述

在这里插入图片描述

springBoot文件上传二(推荐)

1、创建springBoot过程导入相关pom依赖:

<dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.26.7</version>
        </dependency>

2、yml

fdfs:
  so-timeout: 2500            #读取时间
  connect-timeout: 600       #连接超时时间
  thumb-image:               #缩略图
    width: 100
    height: 100
  tracker-list:              #tracker 服务配置地址
     - 192.168.59.128:22122

upload:
   base-url : http://192.168.59.128:8888/
   allow-types:
     - image/jpeg
     - image/png
     - image/bmp
     - image/gif

3、自定义配置类,读取yml文件数据

package com.hyf.fastdfsspringboot2.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2020-03-19 21:10
 */
@ConfigurationProperties(prefix = "upload")
public class UploadProperties {
    private  String baseUrl;   // 访问的IP地址
    private  List<String> allowTypes; //文件类型

    public String getBaseUrl() {
        return baseUrl;
    }

    public void setBaseUrl(String baseUrl) {
        this.baseUrl = baseUrl;
    }

    public List<String> getAllowTypes() {
        return allowTypes;
    }

    public void setAllowTypes(List<String> allowTypes) {
        this.allowTypes = allowTypes;
    }
}

4、文件上传工具类

package com.hyf.fastdfsspringboot2.utlis;

import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.hyf.fastdfsspringboot2.config.UploadProperties;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2020-03-19 22:00
 */
@Component
@EnableConfigurationProperties(UploadProperties.class)
public class UploadService {

    private Log log= LogFactory.getLog(UploadService.class);

    @Autowired
    private FastFileStorageClient storageClient; // 封装好了文件上传的接口

    @Autowired
    private  UploadProperties properties;

    public  String uploadImage(MultipartFile file){

        //  判断文件类型是否匹配
        String contentType = file.getContentType();
        if(!properties.getAllowTypes().contains(contentType)){
               throw new RuntimeException("文件类型不匹配");
        }
        //  校验文件类容
        try {
            BufferedImage image = ImageIO.read(file.getInputStream());
            if(image == null && image.getWidth() == 0 && image.getHeight() == 0){
                throw new RuntimeException("上传文件有问题");
            }
        } catch (IOException e) {
            log.error("校验文件内容失败....{}", e);
            throw new RuntimeException("校验文件内容失败"+e.getMessage());
        }

        try {
        // 上传到 fastDFS
          // 获取扩展名
        String extension = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");
            System.err.println("------------file.getOriginalFilename()----------"+file.getOriginalFilename());
            // 上传
            StorePath storePath = storageClient.uploadFile(file.getInputStream(),file.getSize(),extension,null);
            System.err.println("------------file.getInputStream()----------"+file.getInputStream());
            // 返回的路径
            return  properties.getBaseUrl()+storePath.getFullPath();
        } catch (IOException e) {
            log.error("【文件上传】上传文件失败!....{}", e);
            throw  new RuntimeException("【文件上传】上传文件失败!"+e.getMessage());
        }
    }
}

5、controller

package com.hyf.fastdfsspringboot2.controller;

import com.hyf.fastdfsspringboot2.utlis.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2020-03-19 0:29
 */
@RestController
@RequestMapping("upload")
public class UploadController {

    @Autowired
    private UploadService uploadService;

    /*
    * 文件上传
    * */
    @RequestMapping("doUpload")
    public Map<String,Object> doUpload(MultipartFile mf){
        System.out.println("--------------mf___________"+mf.getOriginalFilename());
        String filePath = uploadService.uploadImage(mf);
        Map map = new HashMap();
        map.put("path",filePath);
        return  map;
    }
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<hr>
<form action="/upload/doUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="mf">
    <input type="submit" value="上传">
</form>
</body>
</html>

运行测试:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值