一、FastDFS概述
1.1?什么是分布式文件系統(tǒng)
單機(jī)時(shí)代
初創(chuàng)時(shí)期由于時(shí)間緊迫,在各種資源有限的情況下,通常就直接在項(xiàng)目目錄下建立靜態(tài)文件夾,用于用戶(hù)存放項(xiàng)目中的文件資源。如果按不同類(lèi)型再細(xì)分,可以在項(xiàng)目目錄下再建立不同的子目錄來(lái)區(qū)分。例如:resources\static\file
、resources\static\img
等。
優(yōu)點(diǎn):便利,使用方便。
缺點(diǎn):文件越多存放越混亂
獨(dú)立文件服務(wù)器
隨著公司業(yè)務(wù)不斷發(fā)展,將代碼和文件放在同一服務(wù)器的弊端就會(huì)越來(lái)越明顯。為了解決上面的問(wèn)題引入獨(dú)立圖片服務(wù)器,
流程:
項(xiàng)目上傳文件時(shí),首先通過(guò)ftp或者ssh將文件上傳到圖片服務(wù)器的某個(gè)目錄下,再通過(guò)Ngnix或者Apache來(lái)訪問(wèn)此目錄下的文件,返回一個(gè)獨(dú)立域名的圖片URL地址,前端使用文件時(shí)就通過(guò)這個(gè)URL地址讀取。
缺點(diǎn):
存在單點(diǎn)故障的問(wèn)題。數(shù)據(jù)備份需要人為干預(yù)。
分布式文件系統(tǒng)
業(yè)務(wù)繼續(xù)發(fā)展,單臺(tái)服務(wù)器存儲(chǔ)和響應(yīng)也很快到達(dá)了瓶頸,新的業(yè)務(wù)需要文件訪問(wèn)具有高響應(yīng)性、高可用性來(lái)支持系統(tǒng)。
優(yōu)點(diǎn):
- 擴(kuò)展能力: 毫無(wú)疑問(wèn),擴(kuò)展能力是一個(gè)分布式文件系統(tǒng)最重要的特點(diǎn);
- 高可用性: 在分布式文件系統(tǒng)中,高可用性包含兩層,一是整個(gè)文件系統(tǒng)的可用性,二是數(shù)據(jù)的完整和一致性;
- 彈性存儲(chǔ): 可以根據(jù)業(yè)務(wù)需要靈活地增加或縮減數(shù)據(jù)存儲(chǔ)以及增刪存儲(chǔ)池中的資源,而不需要中斷系統(tǒng)運(yùn)行。
缺點(diǎn):系統(tǒng)復(fù)雜度稍高,需要更多服務(wù)器
?1.2?FastDFS簡(jiǎn)介
?FastDFS是一個(gè)開(kāi)源的輕量級(jí)分布式文件系統(tǒng)。它解決了大數(shù)據(jù)量存儲(chǔ)和負(fù)載均衡等問(wèn)題。特別適合以中小文件(建議范圍:4KB < file_size <500MB)為載體的在線服務(wù),如相冊(cè)網(wǎng)站、視頻網(wǎng)站等等。
FastDFS特性:
- 文件不分塊存儲(chǔ),上傳的文件和OS文件系統(tǒng)中的文件一一對(duì)應(yīng)
- 支持相同內(nèi)容的文件只保存一份,節(jié)約磁盤(pán)空間
- 下載文件支持HTTP協(xié)議,可以使用內(nèi)置Web Server,也可以和其他Web Server配合使用
- 支持在線擴(kuò)容
- 支持主從文件
分布式文件服務(wù)提供商
1、阿里的OSS
2、七牛云存儲(chǔ)
3、百度云儲(chǔ)存
1.3?FastDFS核心概念
FastDFS服務(wù)端有三個(gè)角色:跟蹤服務(wù)器(tracker)、存儲(chǔ)服務(wù)器(storage)和客戶(hù)端(client)。
tracker
跟蹤服務(wù)器,主要做調(diào)度工作,起負(fù)載均衡的作用。在內(nèi)存中記錄集群中所有存儲(chǔ)組和存儲(chǔ)服務(wù)器的狀態(tài)信息,是客戶(hù)端和數(shù)據(jù)服務(wù)器交互的樞紐。就相當(dāng)于是工廠的包工頭。
storage
存儲(chǔ)服務(wù)器(又稱(chēng):存儲(chǔ)節(jié)點(diǎn)或數(shù)據(jù)服務(wù)器),文件和文件屬性(meta data)都保存到存儲(chǔ)服務(wù)器上。Storage server直接利用OS的文件系統(tǒng)調(diào)用管理文件。相當(dāng)于是工廠的工人。
client
客戶(hù)端,作為業(yè)務(wù)請(qǐng)求的發(fā)起方,通過(guò)專(zhuān)有接口,使用TCP/IP協(xié)議與跟蹤器服務(wù)器或存儲(chǔ)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)交互。FastDFS向使用者提供基本文件訪問(wèn)接口,比如upload、download、append、delete等,以客戶(hù)端庫(kù)的方式提供給用戶(hù)使用。
group
組, 也可稱(chēng)為卷。 同組內(nèi)服務(wù)器上的文件是完全相同的 ,同一組內(nèi)的storage server之間是對(duì)等的, 文件上傳、 刪除等操作可以在任意一臺(tái)storage server上進(jìn)行 。
流程:
Tracker相當(dāng)于FastDFS的大腦,不論是上傳還是下載都是通過(guò)tracker來(lái)分配資源;客戶(hù)端一般可以使用Ngnix等靜態(tài)服務(wù)器來(lái)調(diào)用或者做一部分的緩存;存儲(chǔ)服務(wù)器內(nèi)部分為卷(或者叫做組),卷于卷之間是平行的關(guān)系,可以根據(jù)資源的使用情況隨時(shí)增加,卷內(nèi)服務(wù)器文件相互同步備份,以達(dá)到容災(zāi)的目的。
1.4?FastDFS上傳機(jī)制
首先客戶(hù)端請(qǐng)求Tracker服務(wù)獲取到存儲(chǔ)服務(wù)器的ip地址和端口,然后客戶(hù)端根據(jù)返回的IP地址和端口號(hào)請(qǐng)求上傳文件,存儲(chǔ)服務(wù)器接收到請(qǐng)求后生產(chǎn)文件,并且將文件內(nèi)容寫(xiě)入磁盤(pán)并返回給客戶(hù)端file_id、路徑信息、文件名等信息,客戶(hù)端保存相關(guān)信息上傳完畢。
內(nèi)部機(jī)制如下
1、選擇Tracker server
當(dāng)集群中不止一個(gè)Tracker server時(shí),由于Tracker之間是完全對(duì)等的關(guān)系,客戶(hù)端在upload文件時(shí)可以任意選擇一個(gè)trakcer。
2、選擇Storage server
當(dāng)選定Group后,Tracker會(huì)在Group內(nèi)選擇一個(gè)Storage Server給客戶(hù)端
3、選擇Storage path
當(dāng)分配好Storage Server后,客戶(hù)端將向Storage發(fā)送寫(xiě)文件請(qǐng)求,Storage將會(huì)為文件分配一個(gè)數(shù)據(jù)存儲(chǔ)目錄。
注意:
剩余存儲(chǔ)空間最多的優(yōu)先。
4、生成Fileid
選定存儲(chǔ)目錄之后,Storage會(huì)為文件生一個(gè)Fileid,由Storage Server Ip、文件創(chuàng)建時(shí)間、文件大小、文件crc32和一個(gè)隨機(jī)數(shù)拼接而成,然后將這個(gè)二進(jìn)制串進(jìn)行base64編碼,轉(zhuǎn)換為可打印的字符串。
5、生成文件名
當(dāng)文件存儲(chǔ)到某個(gè)子目錄后,即認(rèn)為該文件存儲(chǔ)成功,接下來(lái)會(huì)為該文件生成一個(gè)文件名,文件名由group、存儲(chǔ)目錄、兩級(jí)子目錄、fileid、文件后綴名(由客戶(hù)端指定,主要用于區(qū)分文件類(lèi)型)拼接而成。
1.5?FastDFS下載機(jī)制
客戶(hù)端帶上文件名信息請(qǐng)求Tracker服務(wù)獲取到存儲(chǔ)服務(wù)器的ip地址和端口,然后客戶(hù)端根據(jù)返回的IP地址和端口號(hào)請(qǐng)求下載文件,存儲(chǔ)服務(wù)器接收到請(qǐng)求后返回文件給客戶(hù)端。
內(nèi)部機(jī)制如下
- client詢(xún)問(wèn)tracker下載文件的storage,參數(shù)為文件標(biāo)識(shí)(組名和文件名)
- tracker返回一臺(tái)可用的storage
- client直接和storage通訊完成文件下載
?二、Linux搭建FastDFS
2.1 安裝FastDFS
下載安裝gcc
安裝方式為yum安裝(需網(wǎng)絡(luò)):
yum install gcc-c++ perl-devel pcre-devel openssl-devel zlib-devel wget
下載安裝FastDFS
wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz
下載安裝FastDFS依賴(lài)
wgethttps://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz
下載安裝FastDFS
wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz
解壓縮依賴(lài)tar包
tar -zxvf V1.0.43.tar.gz -C /usr/local
tar -zxvf V6.06.tar.gz -C /usr/local
編譯并安裝libfastcommon
cd /usr/local/libfastcommon-1.0.43/
./make.sh && ./make.sh install
編譯并安裝FastDFS
cd /usr/local/fastdfs-6.06
./make.sh && ./make.sh install
進(jìn)入etc目錄下復(fù)制配置文件
cd /etc/fdfs/
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf
2.2 創(chuàng)建tracker服務(wù)?
創(chuàng)建tracker目錄
mkdir -p /data/fastdfs/tracker
修改配置文件
vim /etc/fdfs/tracker.conf
disabled=false #啟用配置文件
port=22122 #設(shè)置 tracker 的端口號(hào)
base_path=/data/fastdfs/tracker #設(shè)置 tracker 的數(shù)據(jù)文件和日志目錄(需預(yù)先創(chuàng)建)
http.server_port=8888 #設(shè)置 http 端口號(hào),指的是在tracker服務(wù)器上啟動(dòng)http服務(wù)進(jìn)程,如:apache或者nginx 啟動(dòng)時(shí)所監(jiān)聽(tīng)的端口
啟動(dòng)tracker服務(wù)
/etc/init.d/fdfs_trackerd start
檢查tracker服務(wù)
netstat -lntup |grep fdfs
2.3?創(chuàng)建storage服務(wù)
創(chuàng)建storage目錄
mkdir -p /data/fastdfs/base #日志
mkdir -p /data/fastdfs/storage #文件存儲(chǔ)位置
修改配置文件
vim /etc/fdfs/storage.conf
disabled=false #啟用配置文件
group_name=group1 #組名,根據(jù)實(shí)際情況修改
port=23000 #設(shè)置 storage 的端口號(hào)
base_path=/data/fastdfs/base #設(shè)置 storage 的日志目錄(需預(yù)先創(chuàng)建)
store_path_count=1 #存儲(chǔ)路徑個(gè)數(shù),需要和 store_path 個(gè)數(shù)匹配
store_path0=/data/fastdfs/storage #存儲(chǔ)路徑
tracker_server = 192.168.66.100:22122 #tracker 服務(wù)器的 IP 地址和端口號(hào)
http.server_port=8888 #設(shè)置storage上啟動(dòng)的http服務(wù)的端口號(hào),如安裝的nginx的端口號(hào)
啟動(dòng)storage服務(wù)
/etc/init.d/fdfs_storaged start
查看storage服務(wù)
netstat -lntup |grep fdfs
2.3 配置Client服務(wù)
創(chuàng)建client日志文件目錄
mkdir -p /data/fastdfs/client
修改client配置文件
vim /etc/fdfs/client.conf
connect_timeout=30
network_timeout=60
base_path=/data/fastdfs/client # 日志路徑
tracker_server=192.168.66.100:22122 # 追蹤服務(wù)器的IP,有多個(gè)服務(wù)器可以另一行
?查看啟動(dòng)的服務(wù)
ps -ef | grep fdfs
?三、FastDFS指令
?3.1?上傳文件指令:fdfs_upload_file
fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]
參數(shù)含義:
- <config_file> :客戶(hù)端client配置文件路徑
- <local_filename> :要上傳的文件的地址
- [storage_ip:port] :(可選參數(shù))
- [store_path_index] :(可選參數(shù))
?示例:
fdfs_upload_file /etc/fdfs/client.conf ./pdx.jpg #將當(dāng)前文件夾下的pdx.jpg文件上傳到FastDFS
group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg #上傳文件后會(huì)返回文件在FastDFS中的唯一文件標(biāo)識(shí),即卷名+文件名
在/data/fastdfs/storage/data/00/00可以查看當(dāng)前上傳的文件
?3.2?下載文件指令
fdfs_download_file <config_file> <file_id> [local_filename] [<download_offset> <download_bytes>
參數(shù)含義:
- <config_file> :客戶(hù)端配置文件路徑
- <file_id> :文件在FastDFS中的唯一文件標(biāo)識(shí),即卷名+文件名
- [local_filename] :文件下載地址
- <download_offset> :(可選參數(shù))文件下載開(kāi)始時(shí)間
- <download_bytes> :(可選參數(shù))文件下載的字節(jié)數(shù)
示例:
#將文件下載到當(dāng)前路徑下
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg
3.3?查看文件信息指令
fdfs_file_info <config_file> <file_id>
參數(shù)含義:
- <config_file> :客戶(hù)端配置文件路徑
- <file_id> :文件在FastDFS中的唯一文件標(biāo)識(shí),即卷名+文件名
示例:
#查看文件的信息
fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg
?3.4?刪除文件指令
fdfs_delete_file <config_file> <file_id>
參數(shù)含義:
- <config_file> :客戶(hù)端配置文件路徑
- <file_id> :文件在FastDFS中的唯一文件標(biāo)識(shí),即卷名+文件名
示例:
fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg
注意:
刪除指令使用后,文件在該卷中的所有備份都會(huì)被刪除,因?yàn)榫韮?nèi)的存儲(chǔ)節(jié)點(diǎn)會(huì)相互同步,故慎用。
?四、SpringBoot操作FastDFS實(shí)現(xiàn)文件上傳(基本版)
由GitHub大牛tobato在原作者YuQing與yuqih發(fā)布的JAVA客戶(hù)端基礎(chǔ)上進(jìn)行了大量重構(gòu)工作,并于GitHub上發(fā)布了FastDFS-Client1.26.5。?
主要特性
- 對(duì)關(guān)鍵部分代碼加入了單元測(cè)試,便于理解與服務(wù)端的接口交易,提高接口質(zhì)量
- 將以前對(duì)byte硬解析風(fēng)格重構(gòu)為使用對(duì)象+注解的形式,盡量增強(qiáng)了代碼的可讀性
- 支持對(duì)服務(wù)端的連接池管理
- 支持上傳圖片時(shí)候檢查圖片格式,并且自動(dòng)生成縮略圖
- 在SpringBoot當(dāng)中自動(dòng)導(dǎo)入依賴(lài)
1、創(chuàng)建springboot項(xiàng)目(2.7.0),導(dǎo)入FastDFS依賴(lài)jar?
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.5</version>
</dependency>
2、添加配置
####分布式文件系統(tǒng)配置###########
fdfs:
so-timeout: 1500
connect-timeout: 600
thumb-image: #縮略圖生成參數(shù)
width: 150
height: 150
tracker-list: #TrackerList參數(shù),支持多個(gè)
- 192.168.66.100:22122
# - 192.168.66.101:22122
3、編寫(xiě)測(cè)試類(lèi)實(shí)現(xiàn)文件上傳和文件下載
package com.zj;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.io.*;
@SpringBootTest
class FastdfsApplicationTests {
//通過(guò)FastDFS的客戶(hù)端對(duì)象完成對(duì)文件系統(tǒng)的操作
@Resource
private FastFileStorageClient fastFileStorageClient;
//測(cè)試上傳文件
@Test
public void upload() throws FileNotFoundException {
//1.先讀取本地文件
File file = new File("D:\\aaa.jpg");
//2.創(chuàng)建傳輸文件輸入流
FileInputStream fileInputStream = new FileInputStream(file);
//3.文件上傳
/*
* 參數(shù)一:文件輸入流
* 參數(shù)二:文件大小
* 參數(shù)三:文件拓展名
* 參數(shù)四:描述文件的元數(shù)據(jù)(指定文件上傳的位置)
*/
StorePath storePath = fastFileStorageClient.uploadFile(fileInputStream, file.length(), "jpg", null);
//4.將卷名和文件名一起打印
System.out.println("上傳文件的地址:"+storePath.getFullPath());
System.out.println("文件卷名:"+storePath.getGroup());
System.out.println("文件名:"+storePath.getPath());
}
//文件下載
@Test
public void download() throws IOException {
//1.下載文件
/*
* 參數(shù)一:文件處于存儲(chǔ)節(jié)點(diǎn)的卷名
* 參數(shù)二:文件在存儲(chǔ)節(jié)點(diǎn)的文件名
* 參數(shù)三:下載的回調(diào)函數(shù)
*/
byte[] downloadFile = fastFileStorageClient.downloadFile("group1", "M00/00/00/wKhCZGS2WGaAYKOuADcAPt_yJDw957.jpg", new DownloadByteArray());
//2.創(chuàng)建文件輸出流,并指定文件下載的位置
FileOutputStream fileOutputStream = new FileOutputStream("d:\\aaa.jpg");
//3.將文件輸出流寫(xiě)文件到磁盤(pán)
fileOutputStream.write(downloadFile);
//4.刷新
fileOutputStream.flush();
//5.關(guān)閉流
fileOutputStream.close();
}
}
五、spring boot整合FastDFS實(shí)現(xiàn)文件上傳(完整版)
?1、引入Thymeleaf視圖解析器和文件上傳客戶(hù)端對(duì)象?
<!--fastdfs-->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
注意:
使用wangeditor富文本編輯器的前提是引入Thymeleaf模板。?
2、通過(guò)CDN在前端頁(yè)面引入wangEditor富文本編輯器
<script type="text/javascript" src="https://unpkg.com/wangeditor/dist/wangEditor.min.js"></script>
?3、創(chuàng)建編輯器基本骨架
<div id="div1">
<p>歡迎使用 <b>wangEditor</b> 富文本編輯器</p>
</div>
<script type="text/javascript">
const E = window.wangEditor;
const editor = new E('#div1')
editor.create();
</script>
4、創(chuàng)建文件上傳的Controller控制器
package com.zj.controller;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
@RestController
public class uploadController {
@Resource
private FastFileStorageClient fastFileStorageClient;
//圖片上傳
@PostMapping("/upload")
public void upload(MultipartFile file) throws IOException {
//1.判斷文件是否為空
if(file != null){
//2.獲取上傳的圖片的名字
String originalFilename = file.getOriginalFilename();
//3.獲取上傳的圖片的擴(kuò)展名
String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
//4.上傳圖片
StorePath storePath = fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), suffix, null);
System.out.println("上傳的文件的路徑:"+storePath.getFullPath());
//5.上傳的文件路徑需要保存到數(shù)據(jù)庫(kù)中
//……
}
}
}
文件上傳的請(qǐng)求方式必須是post?
5、完整的index.html頁(yè)面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>文件上傳</title>
<script type="text/javascript" src="https://unpkg.com/wangeditor/dist/wangEditor.min.js"></script>
</head>
<body>
<div id="div1">
<p>歡迎使用 <b>wangEditor</b> 富文本編輯器</p>
</div>
<script type="text/javascript">
const E = window.wangEditor;
const editor = new E('#div1');
//指定文件上傳的服務(wù)路徑
editor.config.uploadImgServer = "/upload";
//文件參數(shù)名
editor.config.uploadFileName = "file";
//限制文件上傳的大小和類(lèi)型 2M
editor.config.uploadImgMaxSize = 2 * 1024 * 1024;
//文件上傳的類(lèi)型
editor.config.uploadImgAccept = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'];
editor.create();
</script>
</body>
</html>
6、啟動(dòng)項(xiàng)目,上傳圖片即可
六、FastDFS整合Nginx
??Nginx服務(wù)器是一個(gè)高性能的web服務(wù)器與反向代理服務(wù)器。
FastDFS集成Nginx的2個(gè)原因
-
為分布式文件系統(tǒng)提供Http服務(wù)支持
通過(guò)Nginx的web服務(wù)代理訪問(wèn)分布式文件系統(tǒng)的存儲(chǔ)節(jié)點(diǎn),從而實(shí)現(xiàn)通過(guò)http請(qǐng)求訪問(wèn)存儲(chǔ)節(jié)點(diǎn)資源。
注意:
src 屬性值圖像文件的 URL。也就是引用該圖像的文件的的絕對(duì)路徑或相對(duì)路徑。
? 2.解決復(fù)制延遲問(wèn)題
由于FastDFS的同卷的存儲(chǔ)節(jié)點(diǎn)之間需要同步,當(dāng)文件尚未同步完成時(shí),訪問(wèn)請(qǐng)求到達(dá)改節(jié)點(diǎn),獲取的數(shù)據(jù)將是未同步完的不完整數(shù)據(jù),即為復(fù)制延遲問(wèn)題。通過(guò)Nginx檢測(cè)請(qǐng)求的存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù),若該存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)尚未同步完成,則將請(qǐng)求轉(zhuǎn)發(fā)至數(shù)據(jù)的原存儲(chǔ)節(jié)點(diǎn),從而解決復(fù)制延遲問(wèn)題。
?環(huán)境搭建
下載Fastdfs的Nginx模塊包
#選擇安裝位置
cd /usr/local
#下載文件(或者使用本文章已經(jīng)下載好的文件)
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz
#解壓文件
tar -zxvf V1.22.tar.gz
在ginx-1.20.2目錄下安裝Nginx依賴(lài)文件
yum install -y gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel gd-devel epel-release
配置Nginx服務(wù)器
#建立Makefile文件,檢查L(zhǎng)inux系統(tǒng)環(huán)境以及相關(guān)的關(guān)鍵屬性。添加fastdfs-nginx-module-1.22模塊到nginx
./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src/
#編譯項(xiàng)目,主要將gcc源代碼編譯成可執(zhí)行的目標(biāo)文件
make
#根據(jù)上一步驟編譯完成的數(shù)據(jù)安裝到預(yù)定的目錄中。之前安裝過(guò)ngxin的話不需要再安裝
make install
注意:
- –add-module:為nginx添加一個(gè)fastdfs-nginx-module模塊,值為該模塊在當(dāng)前系統(tǒng)的路徑
- –prefix:指定nginx安裝位置
將Fastdfs軟件包里面的http.conf和mime.types拷貝到/etc/fdfs目錄下?
cp /usr/local/fastdfs-6.06/conf/mime.types /etc/fdfs/
cp /usr/local/fastdfs-6.06/conf/http.conf /etc/fdfs/
配置Nginx的fastdfs模塊,并編輯文件
#拷貝文件
[root@localhost opt]cp /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
[root@localhost fdfs] vim mod_fastdfs.conf
#保存日志目錄
base_path=/data/fastdfs/storage
#tracker 服務(wù)器的 IP 地址以及端口號(hào)
tracker_server=192.168.66.100:22122
#文件url中是否有g(shù)roup 名
url_have_group_name = true
#存儲(chǔ)路徑
store_path0=/data/fastdfs/storage
group_count = 1 #設(shè)置組的個(gè)數(shù)
#然后在末尾添加分組信息,目前只有一個(gè)分組,就只寫(xiě)一個(gè)
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/storage
配置Nginx
server {
listen 80;
server_name localhost;
location ~ /group[1-3]/M00 {
alias /data/fastdfs/storage/data;
ngx_fastdfs_module;
}
# 根目錄下返回403
location = / {
return 403;
}
# log file
access_log logs/img_access.log access;
}
啟動(dòng)Ningx服務(wù)
# 進(jìn)入sbin目錄
[root@tracker nginx]# cd sbin/
# 啟動(dòng)服務(wù) -c:指定配置文件
[root@tracker sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf
查看服務(wù)啟動(dòng)情況
[root@tracker sbin]# ps -ef | grep nginx
啟動(dòng)追蹤服務(wù)與存儲(chǔ)節(jié)點(diǎn)服務(wù)
[root@tracker sbin]# fdfs_trackerd /etc/fdfs/tracker.conf start
[root@tracker sbin]# fdfs_storaged /etc/fdfs/storage.conf start
上傳圖片測(cè)試
將圖片上傳至linux系統(tǒng)后,使用指令上傳至分布式文件系統(tǒng)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-600581.html
[root@localhost /]# fdfs_upload_file /etc/fdfs/client.conf pdx.jpg
group1/M00/00/00/wKhCZGS6zneAUxGKAANsTCZQKGY401.jpg
通過(guò)瀏覽器遠(yuǎn)程訪問(wèn)
http://192.168.66.100/group1/M00/00/00/wKhCZGS6zneAUxGKAANsTCZQKGY401.jpg
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-600581.html
到了這里,關(guān)于分布式文件存儲(chǔ)與數(shù)據(jù)緩存 FastDFS的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!