FastDFS+Nginx实现文件服务器
一、介绍
1.Tracker 集群
2.Storage集群
上传流程
二、安装部署FastDFS
1.安装gcc环境
2.安装linevent库
3.安装libfastcommon
4.安装fastDFS
1. 解压安装包
2.编译
3.安装
4.复制conf文件
5.创建软连接
5.修改tracker配置文件
6.启动tracker
7.修改storage配置文件
8.启动storage
三、安装部署Nginx
1.安装gcc环境
2.安装pcre
3.安装openssl库
4.解压nginx压缩包
5.启动nginx
四、FastDFS与Nginx整合
五、使用Java代码上传FastDFS
1.bug
2.依赖
3.代码
4.springboot配置文件
5.FastDFS配置文件
五、效果
Bug
FastDFS压缩包:密码:iu73
FastDFS压缩包
Nginx压缩包:密码:k7we
Nginx压缩包
一、介绍
FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS架构包括 Tracker server
和Storage server
。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。
Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。
Storage server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。
1.Tracker 集群
FastDFS集群中的Tracker server可以有多台,Tracker server之间是相互平等关系同时提供服务,Tracker server不存在单点故障。客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。
2.Storage集群
Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。
采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。
上传流程
客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
二、安装部署FastDFS
1.安装gcc环境
安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:yum install gcc-c++
2.安装linevent库
FastDFS依赖libevent库,需要安装:yum -y install libevent
3.安装libfastcommon
libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。
下载libfastcommon:wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
解压V1.0.7.tar.gz
编译./make.sh
安装./make.sh install
创建软连接:
libfastcommon.so 安装到了/usr/lib64/libfastcommon.so,但是FastDFS主程序设置的lib目录是/usr/local/lib,所以需要创建软链接。
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
4.安装fastDFS
1. 解压安装包
tar -zxvf FastDFS_v5.05.tar.gz
2.编译
./make.sh
3.安装
./make.sh install
4.复制conf文件
将安装目录conf文件夹
下的文件复制到/etc/fdfs
下
5.创建软连接
FastDFS 服务脚本设置的 bin 目录是 /usr/local/bin, 但实际命令安装在 /usr/bin/ 下。
ln -s /usr/bin/fdfs_trackerd /usr/local/bin
ln -s /usr/bin/fdfs_storaged /usr/local/bin
ln -s /usr/bin/stop.sh /usr/local/bin
ln -s /usr/bin/restart.sh /usr/local/bin
5.修改tracker配置文件
安装成功后进入/etc/fdfs目录。
修改tracker.conf:vi tracker.conf
将
base_path=/home/yuqing/fastdfs
改为:
base_path=/home/FastDFS/tracker
配置http端口:
http.server_port=80
然后要创建出对应的目录/home/FastDFS/tracker
6.启动tracker
关闭防火墙:systemctl stop firewalld.service
查看防火墙状态:systemctl status firewalld.service
开启防火墙端口:firewall-cmd --zone=public --add-port=22122/tcp --permanent
重启防火墙:firewall-cmd --reload
初次启动: /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
查看端口:netstat -unltp|grep fdfs
以后启动Tracker: service fdfs_trackerd start
关闭Tracker命令:service fdfs_trackerd stop
7.修改storage配置文件
进入/etc/fdfs
目录,修改storage.conf: vim /etc/fdfs/storage.conf
修改一下内容:
base_path=/home/yuqing/fastdfs 改为:base_path=/home/FastDFS/storage
store_path0=/home/yuqing/fastdfs 改为:store_path0=/home/FastDFS/fdfs_storage
#如果有多个挂载磁盘则定义多个store_path,如下
#store_path1=.....
#store_path2=......
tracker_server=192.168.87.128:22122 #配置tracker服务器:IP
#如果有多个则配置多个tracker
#tracker_server=192.168.87.129:22122
#配置http端口
http.server_port=80
创建指定的目录/home/FastDFS/storage
和/home/FastDFS/fdfs_storage
8.启动storage
启动Storage前确保Tracker是启动的
开启防火墙端口:firewall-cmd --zone=public --add-port=23000/tcp --permanent
重启防火墙:firewall-cmd --reload
初次storage启动:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
以后storage启动使用service fdfs_storaged start
关闭storage命令:service fdfs_storaged stop
三、安装部署Nginx
1.安装gcc环境
安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:yum install gcc-c++ ,我们前面已经安装过了。
2.安装pcre
yum install -y pcre pcre-devel
3.安装openssl库
yum install -y openssl openssl-devel
4.解压nginx压缩包
将压缩包上传到/usr/local
目录下,解压:tar -zxvf nginx-1.12.2.tar.gz
编译:./configure
安装:
(分别执行以下命令)
make
make install
5.启动nginx
安装完成以后会出现nginx目录
进入nginx/sbin目录执行./nginx
查看nginx:ps -aux | grep nginx
浏览器访问IP地址+80
注意防火墙开启80端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
启动成功!
停止nginx:./nginx -s quit
重启nginx:./nginx -s reload
四、FastDFS与Nginx整合
修改nginx.conf, vim /usr/local/nginx/conf/nginx.conf
添加如下行,将 /group1/M00 映射到/home/FastDFS/fdfs_storage/data
location /group1/M00 {
alias /home/FastDFS/fdfs_storage/data;
}
注意:修改nginx文件以后要重启nginx! ./nginx -s reload
五、使用Java代码上传FastDFS
1.bug
这个错误是storage没有启动 或者是配置错误 ,这是其中一个可能
有可能是虚拟机的ip地址已经改变,修改配置文件中的ip:
vi /etc/fdfs/storage.conf
2.依赖
<!-- FastDFS -->
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
3.代码
package com.lsh.unit;
import org.csource.common.MyException;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
public class FastDFSUtil {
public static String upload(MultipartFile file) throws Exception{
System.out.println("开始上传!");
// 获得文件名
String fileName = file.getOriginalFilename();
// 获得文件后缀
String[] split = fileName.split("\\.");
String suffix = split[1];
System.out.println("FastDFSUtil : 文件名 : "+fileName+" , 后缀 : "+suffix);
// 1. 加载配置文件
ClientGlobal.init("/Users/LiuShihao/IdeaProjects/fastdfs/src/main/resources/fastdfs-client.properties");
// 2. 创建管理端对象
TrackerClient trackerClient = new TrackerClient();
// 3. 通过管理端对象获取连接
TrackerServer connection = trackerClient.getConnection();
// 4. 创建存储端对象
StorageClient1 storageClient = new StorageClient1(connection, null);
NameValuePair[] meta_list = new NameValuePair[1];
// 需要传入文件名
meta_list[0] = new NameValuePair("fileName", fileName);
// 5. 上传文件
/*
* 参数1:要上传的文件的字节数组
* 参数2:要上传的文件类型
* 参数3:文件属性信息对象数组
* 返回值 : 存储在Storage中的地址
*/
String path = storageClient.upload_file1(file.getBytes(), suffix, meta_list);
System.out.println("FastDFSUtil -上传返回的文件id是 : "+ path);
return path;
}
public static byte[] download(String fid) throws IOException, MyException {
System.out.println("接收到的文件 id" + fid);
// 1. 加载配置文件
ClientGlobal.init("/Users/LiuShihao/IdeaProjects/video/src/main/resources/fastdfs-client.properties");
// 2. 创建管理端对象
TrackerClient trackerClient = new TrackerClient();
// 3. 通过管理端对象获取连接
TrackerServer connection = trackerClient.getConnection();
// 4. 创建存储端对象
StorageClient1 storageClient = new StorageClient1(connection, null);
// 5.通过文件id得到文件的字节数组
byte[] bytes = storageClient.download_file1(fid);
return bytes;
}
}
4.springboot配置文件
我们需要修改文件上传的大小,默认是1M,有的时候我们的图片经常不止1M,所以就会报错。
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
5.FastDFS配置文件
配置tracker_server的地址 = IP地址:22122
connect_timeout = 30
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 80
tracker_server = 116.62.13.104:22122
gitee仓库源码:FastDFS文件服务器
五、效果
启动项目,浏览器访问,选择图片进行上传
点击上传:
服务器:
上传完成后会返回一个ID,这个ID就是图片在的目录!
因为我们已经整合了nginx,所以使用IP地址+目录
就可以访问的到我们刚上传的图片: