将压缩包上传到linux下的/home/fdfs
目录:
FastDFS运行需要一些依赖,如下:
1.2.1 安装GCC依赖GCC用来对C语言代码进行编译运行,使用yum命令安装:
sudo yum -y install gcc
1.2.2 安装unzip工具
unzip工具对压缩包进行解压
sudo yum install -y unzip zip
1.2.3 安装libevent
sudo yum -y install libevent
1.2.4 安装Nginx所需依赖
sudo yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel
1.2.5 安装libfastcommon-master
这个没有yum包,只能通过编译安装:
解压刚刚上传的libfastcommon-master.zip
unzip libfastcommon-master.zip
进入解压完成的目录:
cd libfastcommon-master
编译并且安装:
sudo ./make.sh
sudo ./make.sh install
到这里为止,所有依赖都已经安装完毕,接下来安装FastDFS:
1.3 安装FastDFS 1.3.1 编译安装这里采用编译安装,步骤与刚才的编译安装方式一样:
解压
tar -zxvf FastDFS_v5.08.tar.gz
进入目录
cd FastDFS
编译并安装
sudo ./make.sh
sudo ./make.sh install
校验安装结果
1)安装完成,应该能在/etc/init.d/
目录,通过命令ll /etc/init.d/ | grep fdfs
看到FastDFS提供的启动脚本:
其中:
fdfs_trackerd
是tracker启动脚本
fdfs_storaged
是storage启动脚本
2)可以在 /etc/fdfs
目录,通过命令查看到以下配置文件模板:
其中:
tarcker.conf.sample
是tracker的配置文件模板
storage.conf.sample
是storage的配置文件模板
client.conf.sample
是客户端的配置文件模板
1.3.2 启动tracker
FastDFS的tracker和storage在刚刚的安装过程中,都已经被安装了,因此安装这两种角色的方式是一样的。不同的是,两种需要不同的配置文件。
启动tracker,就修改刚刚看到的tarcker.conf
,并且启动fdfs_trackerd
脚本即可。
首先将模板文件进行赋值和重命名:
sudo cp tracker.conf.sample tracker.conf
sudo vim tracker.conf
打开tracker.conf
,修改base_path
配置:
base_path=/home/fdfs/tracker # tracker的数据和日志存放目录
创建目录
刚刚配置的目录可能不存在,创建出来
sudo mkdir -p /home/fdfs/tracker
启动tracker
可以使用 sh /etc/init.d/fdfs_trackerd
启动,不过安装过程中,fdfs已经被设置为系统服务,可以采用熟悉的服务启动方式:
sudo service fdfs_trackerd start # 启动fdfs_trackerd服务,停止用stop
另外,可以通过以下命令,设置tracker开机启动:
sudo chkconfig fdfs_trackerd on
1.3.3 启动storage
启动tracker,就修改刚刚看到的tarcker.conf
,并且启动fdfs_trackerd
脚本即可。
首先将模板文件进行赋值和重命名:
sudo cp storage.conf.sample storage.conf
sudo vim storage.conf
打开storage.conf
,修改base_path
配置:
base_path=/home/fdfs/storage # storage的数据和日志存放目录
store_path0=/home/fdfs/storage # storage的上传文件存放路径
tracker_server=111.229.237.1:22122 # tracker的地址
创建目录
刚刚配置的目录可能不存在,创建出来
sudo mkdir -p /home/fdfs/storage
启动storage
使用 sh /etc/init.d/fdfs_storaged
启动,同样可以用服务启动方式:
sudo service fdfs_storaged start # 启动fdfs_storaged服务,停止用stop
另外,可以通过以下命令,设置tracker开机启动:
sudo chkconfig fdfs_storaged on
最后,通过ps -ef | grep fdfs
查看进程:
解压
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
配置config文件
# 进入配置目录
cd /home/home/fdfs/fastdfs-nginx-module/src/
# 修改配置
vim config
# 执行下面命令(将配置中的/usr/local改为/usr):
:%s+/usr/local/+/usr/+g
配置mod_fastdfs.conf
# 将src目录下的mod_fastdfs.conf复制到 /etc/fdfs目录:
sudo cp mod_fastdfs.conf /etc/fdfs/
# 编辑该文件
sudo vim /etc/fdfs/mod_fastdfs.conf
修改一下配置:
connect_timeout=10 # 客户端访问文件连接超时时长(单位:秒)
tracker_server=47.102.132.1:22122 # tracker服务IP和端口
url_have_group_name=true # 访问链接前缀加上组名
store_path0=/home/fdfs/storage # 文件存储路径
复制 FastDFS的部分配置文件到/etc/fdfs目录
cd /home/fdfs/FastDFS/conf/
cp http.conf mime.types /etc/fdfs/
1.4.2 安装Nginx
解压
tar -xvf nginx-1.10.0.tar.gz
配置
sudo ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --add-module=/home/fdfs/fastdfs-nginx-module/src
–conf-path=/etc/nginx/nginx.conf
编译安装
sudo make && sudo make install
#注意:如果nginx已安装,只编译,不安装
make
备份之前的nginx
mv /usr/sbin/nginx /usr/sbin/nginx-bck
cd objs
cp nginx /usr/sbin #先拷贝原有文件
配置nginx整合fastdfs-module模块
需要修改nginx配置文件,在/etc/nginx/config/nginx.conf文件中:
sudo vim /etc/nginx/conf/nginx.conf
将文件中,原来的server 80{ ...}
部分代码替换为如下代码:
server {
listen 80;
server_name localhost;
# 监听域名中带有group的,交给FastDFS模块处理
location ~/group([0-9])/ {
ngx_fastdfs_module;
}
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
启动
nginx # 启动
nginx -s stop # 停止
nginx -s reload # 重新加载配置
2.FastDFS介绍
2.1 简介
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
2.2 角色
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
2.3 特性
分组存储,灵活简洁、对等结构,不存在单点
文件ID由FastDFS生成,作为文件访问凭证,FastDFS不需要传统的name server
和流行的web server无缝衔接,FastDFS已提供apache和nginx扩展模块
大、中、小文件均可以很好支持,支持海量小文件存储
支持多块磁盘,支持单盘数据恢复
支持相同文件内容只保存一份,节省存储空间
存储服务器上可以保存文件附加属性
下载文件支持多线程方式,支持断点续传
2.4 同步机制
采用binlog文件记录更新操作,根据binlog进行文件同步
同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行;
文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器;
3.Springboot整合FastDFS
3.1 导入依赖
com.github.tobato
fastdfs-client
1.26.1-RELEASE
3.2 配置config
/**
* @author yan
* @Date:2020/3/31
*/
@Configuration
@Import(FdfsClientConfig.class)
//解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastClientImporter {
}
3.3 yml配置
fdfs:
so-timeout: 25000
connect-timeout: 6000
tracker-list:
- ip地址:22122
3.4 FastDFS上传第三方视频资源
/**
* @author yan
* @Date:2020/3/31
*/
@Configuration
@Slf4j
public class DownloadUtils {
@Autowired
private FastFileStorageClient storageClient;
public String saveUrlAs(String url) {
String fn = "";
String extension = StringUtils.substringAfterLast(url, ".");
HttpURLConnection conn = null;
InputStream inputStream = null;
try {
// 建立链接
URL httpUrl = new URL(url);
conn = (HttpURLConnection) httpUrl.openConnection();
//以Post方式提交表单,默认get方式
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setDoOutput(true);
// post方式不能使用缓存
conn.setUseCaches(false);
//连接指定的资源
conn.connect();
//获取网络输入流
inputStream = conn.getInputStream();
StorePath storePath = storageClient.uploadFile(inputStream,conn.getContentLength(), extension, null);
if (storePath != null) {
fn = storePath.getFullPath();
}
conn.disconnect();
} catch (Exception e) {
log.error("下载直播视频出错:" + e.getMessage());
}
return fn;
}
}
3.5 测试类
/**
* @author yan
* @Date:2020/3/31
*/
@SpringBootTest(classes = {DemoTestApplication.class})
@RunWith(SpringRunner.class)
@Slf4j
class DemoTestApplicationTests {
@Autowired
private DownloadUtils downloadUtils;
@Test
void contextLoads() throws Exception {
String url = "http://jdvodyyjqy.vod.126.net/jdvodyyjqpdzy/0-51736678926296-1578878142518-0-mix.mp4";
String s = downloadUtils.saveUrlAs(url);
log.info("文件地址回调:"+s);
}
}
4.FastDFS常用工具类封装
/**
* @author yan
* @Date:2020/3/31
*/
@Slf4j
@Configuration
public class FastDFSUtils {
@Autowired
private FastFileStorageClient storageClient;
/**
*文件删除
* @param fileUrl
*/
public void deleteFile(String fileUrl) {
if (StringUtils.isEmpty(fileUrl)) {
return;
}
try {
StorePath storePath = StorePath.praseFromUrl(fileUrl);
storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
} catch (FdfsUnsupportStorePathException e) {
log.error("文件删除失败:{}",e.getMessage());
}
}
/**
* 上传文件
*
* @param file
* 文件对象
* @return 文件访问地址
* @throws IOException
*/
public String uploadFile(MultipartFile file) throws IOException {
StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(),
FilenameUtils.getExtension(file.getOriginalFilename()), null);
return storePath.getFullPath();
}
}