FastDFS是什么
这是阿里里面一个大牛自己独立开发的一个独立的分布式文件存储系统, 什么是独立的分布式文件存储系统, 就是外部不能访问的, 如果需要外部访问, 需要有web服务代理, 这就nginx+fastDFS
形成自己的图片存储服务器
至于一些具体的解释,大家可以自行百度
1.安装前准备
FastDFS是C语言开发,建议在linux上运行,本教程使用Centos7.4作为安装环境。
1.1 安装gcc 依赖环境 yum install gcc-c++ -y
1.2 yum -y install libevent
1.3 如果没有perl库,需要使用yum install perl*
命令安装一下
1.4 还有一些必要的工具 yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget
1.5 安装jdk1.8
安装顺序
1 libfastcommon
2 fdfs_tracker
依赖:Gcc、libevent、perl
3 fdfs_storage
4 FastDFS-nginx-module
5 nginx
依赖:pcre-devel、zlib-devel
目录
opt/fastdfs 数据存储目录
usr/local/fdfs 启动文件目录
etc/fdfs 配置文件目录
usr/bin/fdfs_trackerd 启动配置
etc/init.d/fdfs_trackerd 启动服务脚本
准备好以下4个需要的安装软件
这里说一下我的软件都安装在/usr/local目录下
libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。
2.1开始安装libfastcommon
切换至cd /usr/local/
目录
2.1.1 解压 tar -zxvf libfastcommonV1.0.7.tar.gz
2.1.2 cd libfastcommon-1.0.7
2.1.3 ./make.sh
2.1.4 ./make.sh install
执行完如图
执行完上面4个步骤后 这里需要说明一下,libfastcommon安装好后会自动将库文件拷贝至/usr/lib64下,由于FastDFS程序引用usr/lib目录所以需要将/usr/lib64下的库文件拷贝至/usr/lib下。
2.1.5 复制类库libfastcommon.so到/usr/lib下 cp /usr/lib64/libfastcommon.so /usr/lib/
2.2安装fastdfs软件(tracker、storage)
2.2.1 解压 tar zxvf FastDFS_v5.05.tar.gz
2.2.2 切换目录 cd FastDFS
2.2.3 ./make.sh
2.2.4 ./make.sh install
执行完上面4个步骤如下如
看到没自动生成了/etc/fdfs
目录
这里将conf下的配置文件全都拷贝到/etc/fdfs
目录, 在准备步骤里面就说了该目录是配置文件目录, 这里只是一个习惯问题, 配置文件全都放置在etc目录下
2.2.5 cd /conf
2.2.6 cp * /etc/fdfs/
目录如图
配置tracker.conf
2.2.7 cd /etc/fdfs
2.2.9 创建目录 mkdir /opt/fastdfs
在安装准备中说明了该目录为数据存储目录
2.2.10 vi /etc/fdfs/tracker.conf
设置软件数据和日志目录
2.2.11修改 base_path为 base_path=/opt/fastdfs
2.3配置storage
注意说明 storage不需要安装,因为安装tracker时已经同时安装, 但是我们也可以将storage安装至其他服务器, 因为这里我只有一台服务器,所以就都在一台服务器上安装
2.3.1 storage存储文件的目录(新建mkdir /opt/fastdfs/fdfs_storage
)名字自定义
2.3.2 编辑 vi /etc/fdfs/storage.conf
2.3.3 修改数据日志存储路径
2.3.4 修改storage存储文件的目录
如果有多个挂载磁盘则定义多个store_path,如下
2.3.5 修改storage的tracker_server
如果有多个则配置多个tracker
2.4 配置tracker和storage的启动服务
进入/etc/init.d启动脚本目录,默认fastdfs已经生成
2.4.1 cd /etc/init.d
2.4.2 编辑启动脚本vi fdfs_tracherd
prg 启动配置文件其实在/usr/bin目录下 可以cd /usr/bin/ 然后ls fdfs_*查找一下,如下
2.4.3 mkdir /usr/local/fdfs
(因为启动脚本还在安装目录下,所以我们新建/usr/local/fdfs目录,并且将启动脚本cp到该目录)
进入安装目录cd /usr/local/FastDFs
2.4.4 复制启动文件cp restart.sh /usr/local/fdfs/
2.4.5 复制停止文件cp stop.sh /usr/local/fdfs/
2.4.6 配置storage启动服务, 和tracker一样配置(restart和stop脚本已经拷贝到/usr/local/fdfs下,所以storage只需要配置/etc/init.d/fdfs_storage脚本就可以了)
将启动脚本加入linux服务
启动
启动tracker service fdfs_trackerd start
启动storage service fdfs_storaged start
检查是否启动成功
3. 测试上传图片
3.1本地 通过fdfs_test程序测试
fdfs_test是内部的一个测试程序
3.1.1 修改 vi /etc/fdfs/client.conf
client.conf只是fdfs_test读取的一个测试的配置文件
3.1.2 修改base_path 为 base_path=/opt/fastdfs
3.1.3 修改tracker_server 为 tracker_server=192.168.1.101:22122
注意是自己的服务器地址
3.1.4 上传文件 , 比如将/根目录下的erha.png这个图片上传到FastDFS中:
命令 /usr/bin/fdfs_test /etc/fdfs/client.conf upload /erha.png
这个命令的解释
/usr/bin/fdfs_test 运行fdfs_test这个测试进程
/etc/fdfs/client.conf 读取测试配置文件
upload 上传命令
/erha.png 需要上传的图片
查看我上传至linux服务器上的蹄片, 和我本地的图片一样
至此 FastDFS搭建完成
4.1安装FastDFS-nginx-module插件
4.1.1 cd /usr/local
4.1.2 tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
4.1.3 cd fastdfs-nginx-module/src
4.1.4 vi config
修改config文件将/usr/local/路径改为/usr/ 有3处
4.1.5 将fastdfs-nginx-module/src下的mod_fastdfs.conf拷贝至/etc/fdfs/下 cp mod_fastdfs.conf /etc/fdfs/
并修改mod_fastdfs.conf的内容:
4.1.6 vi /etc/fdfs/mod_fastdfs.conf
改变如下4项内容
base_path=/opt/fastdfs/
tracker_server=192.168.1.101:22122
#tracker_server=192.168.1.101:22122(多个tracker配置多行)
url_have_group_name=true #url中包含group名称
store_path0=/opt/fastdfs/fdfs_storage #指定文件存储路径
4.2安装nginx
4.2.1创建目录 mkdir -p /var/temp/nginx/client
4.2.2解压 tar zxvf nginx-1.12.2.tar.gz
4.2.3执行如下命令
./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=/usr/local/fastdfs-nginx-module/src
最后一步是添加插件,就是你安装这个插件的目录
出现如下结果,说明你配置成功了
4.2.4 make
4.2.5 make install
4.2.6 cd /usr/local/nginx/conf
4.2.7 修改nginx.conf文件 vi nginx.conf
修改内容如下
server_name指定本机ip
location /group1/M00/:group1为nginx 服务FastDFS的分组名称,M00是FastDFS自动生成编号,对应store_path0=/home/FastDFS/fdfs_storage,如果FastDFS定义store_path1,这里就是M01
启动nginx
cd /usr/local/nginx/sbin\
./nginx
访问我原来上传的图片
http://192.168.1.101/group1/M00/00/00/wKgBZV2uuceAMxytAAlgc6kXdo0574_big.png
设置开启启动项
编辑 vi /etc/rc.d/rc.local
至此 自己搭建的一个文件服务器完成
服务器安装完毕后,咱们通过Java调用fastdfs
加载Maven依赖
原来没有 fastdfs 没有在中心仓库中提供获取的依赖坐标。
只能自己通过源码方式编译,打好jar 包,安装到本地仓库。
官方源码仓库地址:
https://github.com/happyfish100/fastdfs-client-java
下载源码 git https://github.com/happyfish100/fastdfs-client-java.git
源码放入项目根目录中
install一下
在其他项目中引入该坐标就行了
新建springboot项目,这里就忽略了
在resource文件夹下新建tracker.conf配置文件, 内容如下
tracker_server=192.168.1.101:22122
# 连接超时时间,针对socket套接字函数connect,默认为30秒
connect_timeout=30000
# 网络通讯超时时间,默认是60秒
network_timeout=60000
写个测试类
import org.csource.common.MyException;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
@RunWith(SpringRunner.class)
@SpringBootTest
public class GmallManageWebApplicationTests {
@Test
public void contextLoads() throws IOException, MyException {
// 配置fdfs的全局链接地址
String tracker = GmallManageWebApplicationTests.class.getResource("/tracker.conf").getPath();// 获得配置文件的路径
ClientGlobal.init(tracker);
TrackerClient trackerClient = new TrackerClient();
// 获得一个trackerServer的实例
TrackerServer trackerServer = trackerClient.getConnection();
// 通过tracker获得一个Storage链接客户端
StorageClient storageClient = new StorageClient(trackerServer,null);
//返回的是一个数组,其实就是group组名和文件路径两个信息
String[] uploadInfos = storageClient.upload_file("d:/haha.jpg", "jpg", null);
String url = "http://192.168.1.101";
for (String uploadInfo : uploadInfos) {
url += "/" + uploadInfo;
}
System.out.println(url);
}
}
封装工具类
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
public class PmsUploadUtil {
public static String uploadImage(MultipartFile multipartFile) {
//自己的服务器域名,我这里没有域名,直接写ip
String imgUrl = "http://192.168.1.101";
// 上传图片到服务器
// 配置fdfs的全局链接地址
String tracker = PmsUploadUtil.class.getResource("/tracker.conf").getPath();// 获得配置文件的路径
try {
ClientGlobal.init(tracker);
} catch (Exception e) {
e.printStackTrace();
}
TrackerClient trackerClient = new TrackerClient();
// 获得一个trackerServer的实例
TrackerServer trackerServer = null;
try {
trackerServer = trackerClient.getConnection();
} catch (IOException e) {
e.printStackTrace();
}
// 通过tracker获得一个Storage链接客户端
StorageClient storageClient = new StorageClient(trackerServer,null);
try {
byte[] bytes = multipartFile.getBytes();// 获得上传的二进制对象
// 获得文件后缀名
String originalFilename = multipartFile.getOriginalFilename();// a.jpg
System.out.println(originalFilename);
int i = originalFilename.lastIndexOf(".");
String extName = originalFilename.substring(i+1);
String[] uploadInfos = storageClient.upload_file(bytes, extName, null);
for (String uploadInfo : uploadInfos) {
imgUrl += "/"+uploadInfo;
}
} catch (Exception e) {
e.printStackTrace();
}
return imgUrl;
}
}
对外提供文件上传接口
@RequestMapping("fileUpload")
@ResponseBody
public String fileUpload(@RequestParam("file") MultipartFile multipartFile){
// 将图片或者音视频上传到分布式的文件存储系统
// 将图片的存储路径返回给页面
String imgUrl = PmsUploadUtil.uploadImage(multipartFile);
System.out.println(imgUrl);
return imgUrl;
}
至此整个流程走完
fastdfs集群 待续**************************