chivehao
chivehao
发布于 2022-07-23 / 35 阅读
0
0

给系统安装FastDFS

前言

鉴于FTP结合静态资源站点,配置时太麻烦。
而且并没有比较好的拓展性,计划用FastDFS为系统的文件储存。
为方便我自己以后再次搭建,记录下来搭建过程和一些坑。
视频:暂未上传

环境

  • 操作系统:CentOS 7.X

参考教程

FastDFS 简介

准备工作

端口

需要开放以下端口的TPC,可修改

  • 80 nginx

  • 23000 连接FastDFS的端口

  • 22122 tracker

  • 8888 storage

  • 443 ssl

    安装docker

    请参照我的文档:docker常用命令

下载fastdfs镜像

docker pull season/fastdfs

cd /var

mkdir /fdfs
所有的文件存放在/var/fdfs中 目录清晰

下载nginx

wget http://nginx.org/download/nginx-1.15.9.tar.gz

安装git

直接去github上下载所需要的包也可以

yum install git
git clone https://github.com/happyfish100/fastdfs.git
git clone https://github.com/happyfish100/libfastcommon.git
git clone https://github.com/happyfish100/fastdfs-nginx-module.git

下图三个文件都需要下载

解压nginx

tar -zxvf nginx-1.15.9.tar.gz 
//新建文件夹 存放fastdfs配置文件
mkdir fdfs_conf

目录如下

准备工作结束

到这步,准备工作基本完成,接下来就是重点了,如何配置fastdfs以及整合nginx

开始配置

启动一个临时的tracker 拷贝storage.conf tracker.conf 至/var/fdfs/fdfs_conf

docker run  -d --name tracker  --net=host season/fastdfs tracker
docker ps 
//查询到容器id
docker cp 404(容器ID):/fdfs_conf/tracker.conf `pwd`(当前路径)
docker cp 404(容器ID):/fdfs_conf/storage.conf `pwd`(当前路径)

vim storage.conf 修改tracker_server=实际ip:22122 http.server_port=8888
启动 tracker 和 storage 实际应用应该是多个tracker 多个storage 这里只做演示用,并没有配置多个,其实一个会配置了,其余都一样的,具体集群配置方法自行百度,这里不再赘述。
还有,对于文件夹,先验证下存在此文件夹(试着cd进入目标文件夹,没有就用mkdir命令 创建),再配置到启动参数里。

docker run -ti -d \
--name trakcer \
-v /var/fdfs/tracker_data:/fastdfs/tracker/data \
-v /var/fdfs/fdfs_conf/tracker.conf:/fdfs_conf/tracker.conf  \
--net=host season/fastdfs tracker

docker run -ti --name storage \
-v /var/fdfs/fdfs_conf/storage.conf:/fdfs_conf/storage.conf \
-v /var/fdfs/storage_data:/fastdfs/storage/data \
-v /var/fdfs/store_path:/fastdfs/store_path \
--net=host  season/fastdfs storage

cd /var/fdfs/store_path1/data
ll

测试

是基于SpringBoot测试Maven构建
pom.xml:

                <!-- fastdfs 依赖库-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>
        <dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.26.3</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

application.properties:
记得修改自己的IP地址

server.port=8080


# 文件上传配置
spring.servlet.multipart.max-file-size=4096MB
spring.servlet.multipart.max-request-size=4096MB

# fastDFS 配置
fdfs.so-timeout=1501
fdfs.connect-timeout=601
fdfs.thumb-image.width=150
fdfs.thumb-image.height=150
fdfs.web-server-url=192.168.254.146/
fdfs.tracker-list[0]=192.168.254.146:22122
FDFS_SERVER_HOST=192.168.254.146
FDFS_SERVER_PORT=8888

上传的客户端简单封装:

/**上传客户端封装
 * @ClassName FastDFSClient
 * @Author tobeshrek
 * @Date 2020/4/28 13:20
 */
@Component
public class FastDFSClient {

    @Autowired
    private FastFileStorageClient storageClient;
    @Value("${FDFS_SERVER_HOST}")
    private String FDFS_SERVER_HOST;
    @Value("${FDFS_SERVER_PORT}")
    private Integer FDFS_SERVER_PORT;


    /**
     * 上传文件
     * @param file
     * @return 文件的完整RUL地址
     * @throws IOException
     */
    public String uploadFile(MultipartFile file) throws IOException {
        StorePath storePath = storageClient.uploadFile((InputStream)file.getInputStream(),file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()),null);
        return getResAccessUrl(storePath);
    }

    // 封装文件完整URL地址
    private String getResAccessUrl(StorePath storePath) {
        String fileUrl = "http://"+FDFS_SERVER_HOST+":"+FDFS_SERVER_PORT + "/" + storePath.getFullPath();
        return fileUrl;
    }

    /**
     * 删除文件
     * @param filePath
     * @return 删除是否成功
     */
    public boolean deleteFile(String filePath) {
        try {
            storageClient.deleteFile(filePath);
            return true;
        }catch (FdfsServerException e){
            e.printStackTrace();
            return false;
        }
    }
}

controller层

    @Autowired
    private FastDFSClient dfsClient;

    // 上传文件
    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String upload(MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String fileUrl= dfsClient.uploadFile(file);
        return fileUrl;
    }

    @DeleteMapping("/delete")
    public Boolean delete(String fileUrl){
        return dfsClient.deleteFile(fileUrl);
    }

使用POSTMAN测试:
image.png

命令行查看文件:
cd /var/fdfs/store_path/data/00/00
ll
image.png

上传成功了,然后就剩下通过nginx反向代理http请求了。

配置nginx反向代理http请求

安装依赖

yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

安装libfastcommon

cd /var/fdfs/libfastcommon
./make.sh
./make.sh install

安装fastdfs

cd /var/fdfs/fastdfs
./make.sh
./make.sh install

安装 nginx

cd /var/fdfs
tar -zxvf nginx-1.15.9.tar.gz
cd nginx-1.15.9

./configure \
--add-module=/var/fdfs/fastdfs-nginx-module/src \
--with-http_ssl_module

make && make install

一切顺利的话 你在/usr/local/ 目录下就可以看到nginx了。
image.png

复制配置文件,没有的文件夹(比如/etc/fdfs)自己创建

cp -r /var/fdfs/fastdfs/conf/* /etc/fdfs/
cp /var/fdfs/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs

/etc/fdfs目录中的所有文件是nginx 整合fastdfs-nginx-module所用到的配置文件

修改配置

vi /etc/fdfs/storage.conf
# 以下是配置文件里需要修改的项,请根据自己的情况修改
base_path=/var/fdfs/store_path
store_path0=/var/fdfs/store_path
tracker_server=192.168.254.146:22122
http.server_port=8888 //需要与nginx监听的端口一致

vi /etc/fdfs/tracker.conf
# 以下是配置文件里需要修改的项,请根据自己的情况修改
base_path=/var/fdfs/tracker_data

vi /etc/fdfs/mod_fastdfs.conf
# 以下是配置文件里需要修改的项,请根据自己的情况修改
tracker_server=192.168.254.146:22122
store_path0=/var/fdfs/store_path
url_have_group_name = true //请求路径是否携带组信息 

修改nginx的配置

vi /usr/local/nginx/conf/nginx.conf
# 在http{}中添加个服务
server {
        listen       8888;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location ~/group([0-9])/M00 {
        # root /var/fdfs/storage_path;
            ngx_fastdfs_module;
      }
}

启动nginx

cd /usr/local/nginx/sbin
./nginx

//重新加载 
./nginx -s reload
//停止
./nginx -s stop

访问浏览器

SSL 加密访问

修改文件储存容器配置文件

vi /var/fdfs/fdfs_conf/storage.conf

http.server_port=443
# 改好后保存
# 再重启容器
docker ps
docker stop storage
docker start storage

修改nginx配置文件,相应的ssl证书请上传到/usr/local/nginx/conf目录下,并更改成对应的名称(可自己定义,对上就行)

vi /usr/local/nginx/conf/nginx.conf
# 改成如下
# http里之前的server修改成这样
    server {
        listen       80;
        server_name  resource.tobeshrek.com;
        # 跳转到HTTPS
        return 301 https://$server_name$request_uri;   
    }
# 再在下方加如下
    # 静态资源站点 和 fastdfs ssl加密访问配置
    server {
        listen       443 ssl;
        server_name  resource.tobeshrek.com;
        # ssl 证书配置
        ssl_certificate      resource.pem;
        ssl_certificate_key  resource.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;


        #access_log  logs/host.access.log  main;

        location ~/group([0-9])/M00 {
        # root /var/fdfs/storage_path;
            ngx_fastdfs_module;
      }
   }
# 配置保存好,然后重启nginx
cd /usr/local/nginx/sbin
./nginx -s reload

END


评论