雲計算

在springboot中整合FastDFS+Nginx文件存儲服務器(單機版本)進行文件上傳操作

公司當時需要自己做一個簡單的商城,將公司的產品放在這個商城上售賣。
做商城需要考慮的問題很多,其中一項就是大量商品圖片的存儲,為了解決這個問題,我在網上搜尋(當時我們還沒有使用阿里的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客戶端進行商城圖片的上傳和下載操作了。

Leave a Reply

Your email address will not be published. Required fields are marked *