在springboot中整合FastDFS+Nginx文件存储服务器(单机版本)进行文件上传操作

简介: FastDFS可以用于存储大量的小文件,比如商城的图片、音频文件等,本文介绍FastDFS+Nginx的安装和整合到Springboot项目中。

公司当时需要自己做一个简单的商城,将公司的产品放在这个商城上售卖。
做商城需要考虑的问题很多,其中一项就是大量商品图片的存储,为了解决这个问题,我在网上搜寻(当时我们还没有使用阿里的OSS+CDN)在经过一番搜寻后找到了FastDFS。

看FastDFS官方仓库中的介绍,正好符合我的需求。

image.png

其特点如下:

  1. 高性能
  2. 可心分布式部署
  3. 具有文件存储、同步、上传、下载功能
  4. 有负载平衡能力

下面我们就来看看怎么搭建起这个FastDFS文件存储系统并和Spirngboot项目对接起来,对项目中文件上传下载图片功能进行支持。

1.软件下载地址

fastdfs的github地址:
https://github.com/happyfish100/fastdfs

fastdfs的java客户端github地址:
https://github.com/happyfish100/fastdfs-client-java (这是fastdf作者写的客户端)
https://github.com/tobato/FastDFS_Client (这是其它作者封装的客户端,这次我们用这个)

2.环境

搭建环境: centos7.4(最好是一个干净的系统)

3.准备工作

1.上传所需文件到centos服务器上并解压这些文件

fastdfs-5.11.tar.gz
fastdfs-nginx-module-1.20.tar.gz
libfastcommon-1.0.39.tar.gz
nginx-1.14.1.tar.gz

2.安装libevent库

$ yum -y install libevent

3.进入解压后的libfastcommon-1.0.39目录中执行下面的安装命令


$ ./make.sh && ./make.sh install

4.安装后能在/usr/lib64或者/usr/lib目录中查找libfastcommon.so文件 , 如果只在/usr/lib64目录中找到就把它复制到/usr/lib目录中

4.安装tracker服务并启动(跟踪器)

1.进入fasfdfs解压后的目录


$ cd fastdfs-5.11

2.执行编译和安装命令, 执行命令后,会将fastdfs安装在/usr/bin/etc/fdfs/目录下,使用$ ll /usr/bin/fdfs*命令可以查看到安装后的相关文件

./make.sh && ./make.sh install

3.进入fastdfs5.11/conf目录中,把里面所有的配置文件复制到/etc/fdfs目录中


$ cp * /etc/fdfs

4.进入/etc/fdfs/目录中, 使用$ vim tracker.conf命令打开tracker.conf文件,在打开后的文件中进行修改,将basepath的值修改为/fastdfs/tracker(fastdf目录下的tracker)

5.到根目录下创建这些目录

    $ mkdir /fastdfss/tracker -p
    $ mkdir /fastdfs/storage -p
    $ mkdir /fastdfs/client -p
    $ mkdir /fastdfs/temp -p

6.使用以下的命令启动tracker

$ /usr/bin/fdfs_trackerd /etc/fdfs/tracker_conf
# 重启服务
$ /usr/bin/fdfs_trackerd /etc/fdfs/tracker_conf restart

5.启动storage服务(存储器)

1.到/etc/fdfs目录下,打开并修改storage.conf文件,修改内容如下:


basepath=/fasddfs/storage
store_path0=/fastdfs/storage
group_name=sl (注:这个组名自己定义)
tracker_server=192.168.213.120:22122(注:这里填写服务器本机ip)

2.使用以下命令启动storage

$ /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
# 重启服务
$ /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

3.可以使用以下命令查看服务启动后的状态

# 查看tracker状态
$ ps aux|grep tracker  

# 查看storage状态
$ ps aux|grep storage

6.测试上传文件功能

1.进入/etc/fdfs/目录下,修改这个目录中的client.conf文件,修改内容如下:


basepath=/fastdfs/client
tracker_server=192.169.213.120:22122 (注:这里填写服务器本机ip)

2.使用下面的测试命令上传一张图片,会返回图片的访问链接地址


$ /usr/bin/fdfs_test /etc/fdfs/client.conf upload 我是测试图片.jpg

命令执行返回结果如下:

This is FastDFS client test program v5.11

Copyright (C) 2008, Happy Fish / YuQing

FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page http://www.csource.org/
for more detail.

[2018-11-20 04:36:38] DEBUG - base_path=/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0

tracker_query_storage_store_list_without_group:
        server 1. group_name=, ip_addr=192.168.213.120, port=23000

group_name=sl, ip_addr=192.168.213.120, port=23000
storage_upload_by_filename
group_name=sl, remote_filename=M00/00/00/wKjVeFvz_9aAcMNOAAEJsJdjMjM460.jpg
source ip address: 192.168.213.120
file timestamp=2018-11-20 04:36:38
file size=68016
file crc32=2539860531
example file url: http://192.168.213.120/sl/M00/00/00/wKjVeFvz_9aAcMNOAAEJsJdjMjM460.jpg
storage_upload_slave_by_filename
group_name=sl, remote_filename=M00/00/00/wKjVeFvz_9aAcMNOAAEJsJdjMjM460_big.jpg
source ip address: 192.168.213.120
file timestamp=2018-11-20 04:36:38
file size=68016
file crc32=2539860531
example file url: 

# 这是图片文件上传服务器后返回的图片访问路径
http://192.168.213.120/sl/M00/00/00/wKjVeFvz_9aAcMNOAAEJsJdjMjM460_big.jpg

3.可以看到返回信息中显示了图片的访问链接地址。

7.安装并配置nginx

1.配置nginx的fastdfs模块,进入前面第3步解压后的fastdfs-nginx-module-1.20/src目录中,修改此目录下的config文件,修改内容如下:


    ngx_addon_name=ngx_http_fastdfs_module
    
    if test -n "${ngx_module_link}"; then
        ngx_module_type=HTTP
        ngx_module_name=$ngx_addon_name
        ngx_module_incs="/usr/local/include"
        ngx_module_libs="-lfastcommon -lfdfsclient"
        ngx_module_srcs="$ngx_addon_dir/ngx_http_fastdfs_module.c"
        ngx_module_deps=
        CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
        . auto/module
    else
        HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
        NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
        CORE_INCS="$CORE_INCS /usr/local/include"
        CORE_LIBS="$CORE_LIBS -lfastcommon -lfdfsclient"
        CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
    fi

    把上面这两个地方修改成下面的样子
    ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
    CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

2.安装nginx支持库

$ yum -y install gcc-c++
$ yum -y install pcre pcre-devel
$ yum -y install zlib zlib-devel
$ yum -y install openssl openssl-devel

3.在nginx的文件目录中执行带以下配置的$ configure命令(这个配置里包括添加上面的模块)


$ ./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx/pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--add-module=/root/fastDFS/fastdfs-nginx-module-1.20/src


执行命令后返回的结果

Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/var/run/nginx/nginx/pid"
  nginx error log file: "/var/log/nginx/error.log"
  nginx http access log file: "/var/log/nginx/access.log"
  nginx http client request body temporary files: "/var/temp/nginx/client"
  nginx http proxy temporary files: "/var/temp/nginx/proxy"
  nginx http fastcgi temporary files: "/var/temp/nginx/fastcgi"
  nginx http uwsgi temporary files: "/var/temp/nginx/uwsgi"
  nginx http scgi temporary files: "/var/temp/nginx/scgi"

4.进入nginx文件目录,使用以下命令编译和安装nginx软件(不用/make, 直接make)

$ make && make install 
# 注:安装后会在/usr/local目录下有一个nginx文件夹,这个文件夹就是安装后的nginx程序

5.进入fastdfs-nginx-module目录中,复制模块配置(这个是fastdfs和nginx配合的配置文件)

$ cp mod_fastdfs.conf /etc/fdfs/

6.进入/etc/fdfs/目录中,修改此目录中的mod_fastdfs.conf文件,修改内容如下:

basepath=/fastdfs/temp
group_name=sl # (注:同上面storage的组名一样)
url_have_group_name = true
store_path0=/fastdfs/storage # (注:同storage的配置目录,这个是用于存储文件的目录)

7.进入nginx的安装目录/usr/local/nginx/中,修改nginx.conf这个配置文件,修改内容如下:


# 添加一个server
server {
    listen  88;
    server_name  localhost;

    # 这个/sl/M00是上面设置的组名和自动生成的MOO前缀
    location /sl/M00 {
        # 这里是我们添加的模块名
        ngx_fastdfs_module;
    }
}

8.进入/usr/local/nginx/sbin目录执行以下相关命令操作nginx

  
 # 检查nginx配置文件是否正确
 $ ./nginx -t

[root@localhost nginx]# ./sbin/nginx -t
ngx_http_fastdfs_set pid=23514
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: [emerg] mkdir() "/var/temp/nginx/client" failed (2: No such file or directory)
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

# 报错说找不到一个目录(/var/temp/nginx/client),我们使用以下命令创建这个目录
$ mkdir /var/temp/nginx/client -p

# 再次使用检测命令测试,即可通过测试
$ ./nginx -t

# 开启nginx服务
$ nginx ./nginx

9.关闭防火墙


$ /etc/init.d/iptables stop

执行命令返回结果如下:
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]

10.在浏览器中访问192.168.213.120(服务器id地址)可以看到nginx默认首页

11.重启所有服务(tracker storage nginx firewall)

$ /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
$ /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
$ /usr/local/nginx/sbin/nginx
$ /etc/init.d/iptables stop

12.在浏览器中访问之前测试上传的图片,可以成功在浏览器中访问图片

http://192.168.213.120:88/sl/M00/00/00/wKjVeFvz_9aAcMNOAAEJsJdjMjM460.jpg

8.整合springboot

1.在springboot工程中添加fastdfs-client-java的maven依赖

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

2.在springboot工程中添加配置类ComponetImport.java

/**
 * 导入FastDFS-Client组件
 * 
 * @author tobato
 *
 */
@Configuration
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class ComponetImport {
    // 导入依赖组件
}
注意:@EnableMBeanExport解决问题JMX重复注册问题,issue #8 issue #18,不要再配置 spring.jmx.enabled=false,以免影响SpringBoot默认的JMX监控。

3.在工程配置文件application.yml中修改fastdfs相关参数, 修改如下:

# ===================================================================
# 分布式文件系统FDFS配置
# ===================================================================
fdfs:
  so-timeout: 1501
  connect-timeout: 601 
  thumb-image:             #缩略图生成参数
    width: 80
    height: 80
  tracker-list:            #TrackerList参数,支持多个
    - 192.168.213.120:22122    # 这里填写安装fastdfs的服务器地址

4.整合好后就可以在java代码中注入相关的工具进行上传下载操作了,注入代码如下:


@Autowired
private FastFileStorageClient storageClient;

这个类的部分方法如下,根据方法名可以很容易看出各个方法的作用
    storageClient.uploadFile
    storageClient.uploadFile2
    storageClient.uploadQRCode
    storageClient.uploadFace
    storageClient.uploadBase64
    storageClient.uploadFile
    storageClient.deleteFile
    storageClient.storageClient

至此,我们就搭建起了单机版的FastDFS文件存储系统,并和Springboot项目进行了整合。
我们就可以直接在Springboot项目中的业务代码里使用FastDFS客户端进行商城图片的上传和下载操作了。

目录
相关文章
|
1月前
|
消息中间件 Java Kafka
Springboot集成高低版本kafka
Springboot集成高低版本kafka
|
5天前
|
缓存 负载均衡 安全
深入探索Nginx高性能Web服务器配置与优化
【5月更文挑战第7天】本文深入探讨了Nginx的配置与优化,重点介绍了基础配置参数如`worker_processes`、`worker_connections`和`keepalive_timeout`,以及优化策略,包括使用epoll事件驱动模型、开启gzip压缩、启用缓存、负载均衡和安全配置。此外,还提到了性能调优工具,如ab、nginx-stats和nmon,以助于提升Nginx的性能和稳定性。
|
12天前
|
SQL Java 数据库连接
Springboot框架整合Spring JDBC操作数据
JDBC是Java数据库连接API,用于执行SQL并访问多种关系数据库。它包括一系列Java类和接口,用于建立数据库连接、创建数据库操作对象、定义SQL语句、执行操作并处理结果集。直接使用JDBC涉及七个步骤,包括加载驱动、建立连接、创建对象、定义SQL、执行操作、处理结果和关闭资源。Spring Boot的`spring-boot-starter-jdbc`简化了这些步骤,提供了一个在Spring生态中更便捷使用JDBC的封装。集成Spring JDBC需要添加相关依赖,配置数据库连接信息,并通过JdbcTemplate进行数据库操作,如插入、更新、删除和查询。
|
12天前
|
SQL Java 数据库连接
Springboot框架整合Spring Data JPA操作数据
Spring Data JPA是Spring基于ORM和JPA规范封装的框架,简化了数据库操作,提供增删改查等接口,并可通过方法名自动生成查询。集成到Spring Boot需添加相关依赖并配置数据库连接和JPA设置。基础用法包括定义实体类和Repository接口,通过Repository接口可直接进行数据操作。此外,JPA支持关键字查询,如通过`findByAuthor`自动转换为SQL的`WHERE author=?`查询。
|
12天前
|
XML Java 数据库连接
Springboot整合mybatisPlus操作数据库
MyBatis-Plus是MyBatis的增强工具,简化开发、提高效率。它提供官网文档,便于集成到SpringBoot项目中。集成步骤包括添加mybatis-plus-boot-starter和数据库驱动依赖,配置数据源,扫描Mapper类包。Mapper接口继承BaseMapper即可使用基本的CRUD操作。示例代码展示了Service层的增删改查实现。MyBatisPlus还支持逻辑删除、自动填充等功能,同时可与Mybatis XML配合使用,通过调整配置指定XML映射文件位置。
|
15天前
|
网络协议 Serverless 应用服务中间件
Serverless 应用引擎操作报错合集之在阿里云函数计算中,服务器调用FC函数时出现 "[Errno -3] Temporary failure in name resolution)" 错误如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
164 4
|
17天前
|
安全 Java API
SpringBoot 实现 elasticsearch 索引操作(RestHighLevelClient 的应用)
SpringBoot 实现 elasticsearch 索引操作(RestHighLevelClient 的应用)
19 1
|
17天前
|
自然语言处理 Java 索引
SpringBoot 实现 elasticsearch 查询操作(RestHighLevelClient 的案例实战)
SpringBoot 实现 elasticsearch 查询操作(RestHighLevelClient 的案例实战)
20 1
|
18天前
|
负载均衡 监控 Unix
[AIGC] Nginx:一个高性能的 Web 服务器和反向代理
[AIGC] Nginx:一个高性能的 Web 服务器和反向代理
|
25天前
|
应用服务中间件 Linux 开发工具
如何在阿里云服务器快速搭建部署Nginx环境
以下是内容的摘要: 本文档主要介绍了在阿里云上购买和配置服务器的步骤,包括注册阿里云账号、实名认证、选择和购买云服务器、配置安全组、使用Xshell和Xftp进行远程连接和文件传输,以及安装和配置Nginx服务器的过程。在完成这些步骤后,你将能够在服务器上部署和运行自己的网站或应用。