图片服务器部署(docker部署和分离部署)
Posted 南无24
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图片服务器部署(docker部署和分离部署)相关的知识,希望对你有一定的参考价值。
FastDFS介绍
1、简介
FastDFS 是一个开源的高性能分布式文件系统(Distributed File System)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件为载体的在线服务,如图片、文档、音频、视频等。(文件大小建议范围:4KB<file_size<500MB)
FastDFS设计是用来存储小文件的,过大的文件处理方案是拆分为小文件,可跟踪小文件的上传情况。如果应用场景都是处理大文件,可能选择其他分布式文件系统方案会更合适。 如:HDFS(Hadoop Distributed File System)
2、优缺点
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
-
优点:
- 支持在线扩容,动态添加卷
- 支持文件冗余备份和负载均衡
- 文件不分块存储,文件和系统中的文件一一对应
- 对文件内容做hash处理,避免出现重复文件,节约磁盘空间
- 存储服务器上可以保存文件属性(meta-data)
- V2.0 网络通信采用libevent,支持大并发访问,整体性能更好
-
缺点:
- 单线程数据同步,仅适合存储小文件
- 备份数根据存储分卷(分组)决定,缺乏文件备份数设置灵活性
- 直接按文件存储,可直接查看文件内容,缺乏文件安全性
- 单个挂载点异常会导致整个存储节点下线
- 缺乏多机房容灾支持
- 静态的负载均衡机制
3、结构组成
-
Tracker Server:
跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周 期性心跳。
-
Storage Server:
存储服务器,主要提供容量和备份服务;以group为单位,每个group内可以有多台storage server,数据互为备份。
-
Client:
客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
Tracker相当于一个调度中心,上传和下载都通过它来进行分配指定。
Storage cluster部分,由Volume1、Volume2……VolumeK组成,它们称为卷(或者叫做组),卷与卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。
4、上传过程
-
服务启动之后,Storage Server会定期的向Tracker Server上传状态消息
-
客户端请求Tracker进行上传操作时,会获取存储服务器相关信息,主要包括storageIP和端口
-
根据返回信息上传文件(file content和metadata),通过存储服务器写入磁盘
-
返回给客户端file_id、路径信息、文件名等信息
当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage server。
当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件。
5、下载过程
docker部署fastDFS图片服务器
安装docker
CentOS Docker 安装 | 菜鸟教程 (runoob.com)
开始
1、准备工作
端口开放
本文档图片服务器搭建用到了端口22122(tracker)、23000(storage)、8899(nginx)
- 使用虚拟机进行操作时,需开启防火墙后将以上三个端口打开
- 若是在云服务器上进行测试,需将以上三个端口号加入安全组规则,也需开启防火墙开放端口
防火墙相关命令放于附录
拉取镜像
docker pull delron/fastdfs
2、启动服务
启动tracker
docker run -d --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
启动storage和nginx
注意:ip为tracker服务器的地址
docker run -d --network=host --name storage -e TRACKER_SERVER=ip:22122 -v /var/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage
启动后使用:docker ps命令查看是否成功
3、修改配置
进入storage容器
docker exec -it storage /bin/bash
修改storage内部http.server_port
vi /etc/fdfs/storage.conf
http.server_port=8899
修改nginx端口
vi /usr/local/nginx/conf/nginx.conf
listen 8899;
退出:exit
4、重启容器
docker restart storage
至此,通过docker部署fstdfs文件服务器完成,测试是否成功可参照下面一章中的测试!!!!
分布式图片服务器部署
工作准备
1、安装依赖的环境
# 安装gcc环境
yum -y install gcc-c++
# 有环境的显示如下,之前未安装的只需等待即可
# 安装FastDFS依赖libevent库
yum -y install libevent
# 看到Complete即为安装成功
2、文件(压缩包)准备
链接:https://pan.baidu.com/s/1awqI0esvfijQvUm8zM96mw
提取码:hm71
使用Xftp或其他工具将以下四个文件上传至服务器的/usr/local/fdfs目录下
## 步骤:
# 到/usr/local/目录下
cd /usr/local/
# 创建文件夹
mkdir fdfs
# 查看
cd /usr/local/fdfs
ll
3、端口开放
本文档图片服务器搭建用到了端口22122(tracker)、23000(storage)、8899(nginx)
- 使用虚拟机进行操作时,需开启防火墙后将以上三个端口打开
- 若是在云服务器上进行测试,需将以上三个端口号加入安全组规则,也需开启防火墙开放端口
防火墙相关命令放于附录
安装
libfastcommon安装
libfastcommon 包含了FastDFS运行所需要的一些基础库
# 解压libfastcommon安装包
tar -zxf libfastcommonV1.0.7.tar.gz
ll
# 进入文件
cd libfastcommon-1.0.7/
# 编译
./make.sh
./make.sh install
PS:libfastcommon安装好后会自动将库文件拷贝到/usr/lib64
下,而FastDFS程序引用usr/lib
目录,因此需要将/usr/lib64
下的库文件拷贝到/usr/lib
下
cd /usr/lib64/
cp libfastcommon.so /usr/lib/
find /usr/lib/ -name libfastcommon.so
FastDFS_v5.05.tar.gz安装
PS:此文档中将tracker、storage均配置在一台服务器上,真实环境可分开配置、集群配置
cd /usr/local/fdfs/
ll
tar -zxf FastDFS_v5.05.tar.gz
ll
cd FastDFS/
ll
PS: 可以看到文件内有我们需要的tracker、storage以及用于测试的client。
# 编译运行
./make.sh
./make.sh install
安装成功后将 /usr/local/fdfs/FastDFS/conf/下的文件拷贝到/etc/fdf/文件下
cd /etc/fdfs/
ll
cd /usr/local/fdfs/FastDFS/conf/
cp * /etc/fdfs/
配置tracker
复制路径
# 进入FastDFS文件下的tracker文件下进行tracekr配置
cd /usr/local/fdfs/FastDFS/tracker/
# 显示当前路径,需手动复制
pwd
/usr/local/fdfs/FastDFS/tracker
修改配置
vi /etc/fdfs/tracker.conf
基本操作:
-
----i 开始修改
-
----Esc 退出修改
-
----:wq 保存并退出
-
----:q! 不保存退出
# 将base_path路径改为已复制路径
base_path=/usr/local/fdfs/FastDFS/tracker
# 编辑后保存并退出
启动tracker服务
fdfs_trackerd /etc/fdfs/tracker.conf start
监听
netstat -unltp|grep fdfs
tracker启动成功!!!!
配置storage
复制路径
cd /usr/local/fdfs/FastDFS/storage/
pwd
/usr/local/fdfs/FastDFS/storage
修改配置
vi /etc/fdfs/storage.conf
-
将base_path和store_path0的路径改为已复制路径
-
base_path=/usr/local/fdfs/FastDFS/storage
-
store_path0=/usr/local/fdfs/FastDFS/storage
# 修改tracker服务器的ip和端口(端口默认为22122)
# ip为tracker服务器地址
tracker_server=ip:22122
# 编辑后保存并退出
启动和监听
# 启动
fdfs_storaged /etc/fdfs/storage.conf start
# 监听
netstat -unltp|grep fdfs
storage启动成功!!!!
配置客户端测试上传
复制路径
cd /usr/local/fdfs/FastDFS/client/
pwd
/usr/local/fdfs/FastDFS/client
修改配置
vi /etc/fdfs/client.conf
- 将base_path路径改为已复制路径
- tracker_server的ip地址改为tracker服务器的ip
base_path=/usr/local/fdfs/FastDFS/client
tracker_server=xxxx:22122
# 编辑后保存并退出
测试上传
创建文件
cd /root/
ls
# 创建一个txt文件,编辑后保存退出
vi hello.txt
上传
# 上传命令
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/hello.txt
# 返回如下地址即为上传成功(如下图)
# example file url: http://43.140.202.119/group1/M00/00/00/CgAIC2M2i-6AR4wcAAAAED0JP-g793_big.txt
# 检验
cd /usr/local/fdfs/FastDFS/storage/data/00/00/
ll
# 可看到,已上传文件已经在storage的data目录下的00/00目录下存储起来了
注意: 此时仅代表通过fastdfs将文件上传至服务器,若要将此地址复制到浏览器可访问,
还需通过nginx进行代理。
nginx安装及nginx插件
a、nginx依赖的环境
-
gcc(工作准备中已安装)
-
PCRE
yum install -y pcre pcre-devel
-
zlib
yum install -y zlib zlib-devels
-
openssl
yum install -y openssl openssl-devel
b、nginx安装
cd /usr/local/fdfs/
ll
# 解压nginx-1.10.3.tar.gz
tar -zxf nginx-1.10.3.tar.gz
# 进入nginx-1.10.3
cd nginx-1.10.3/
c、FastDFS的nginx插件安装及配置
cd /usr/local/fdfs/
ll
# 解压
tar -zxf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module/
修改配置
cd src/
ls
# 修改fastdfs-nginx-module/src/config文件,把其中的`local`去掉
vi config
# 手动敲以下命令
:%s/local\\///g
# 将lib改为lib64,如下图
# 后保存并退出
# 将fastdfs-nginx-module/src/mod_fastdfs.conf文件复制到/etc/fdfs目录下,并编辑该文件
cp mod_fastdfs.conf /etc/fdfs/
vi /etc/fdfs/mod_fastdfs.conf
# 将tracker服务器ip改为相对应的tracker服务器ip地址
tracker_server=xxxx:22122
# 将store_path0修改成storage文件夹相对应位置
store_path0=/usr/local/fdfs/FastDFS/storage
# 默认false,改成true
url_have_group_name = true
# 保存后退出编辑
d、修改nginx配置
复制路径
cd /usr/local/fdfs/fastdfs-nginx-module/src/
pwd
/usr/local/fdfs/fastdfs-nginx-module/src
修改配置
# 插件配置
cd /usr/local/fdfs/nginx-1.10.3/
# ./configure --add-module=复制的路径
./configure --add-module=/usr/local/fdfs/fastdfs-nginx-module/src
# 安装编译
make
make insatll
# nginx配置
cd /usr/local/nginx/conf/
vi nginx.conf
# 添加server
server
listen 8899;
server_name localhost;
location /group1/M00
root /usr/local/fdfs/FastDFS/storage/data;
ngx_fastdfs_module;
e、启动nginx
cd /usr/local/nginx/sbin/
# 启动
./nginx
# 查看是否启动成功
ps -aux | grep nginx
此时即可将测试上传时得到的链接输入浏览器,进行访问
注意:在ip地址后加上端口号(8899)
43.140.202.119:8899/group1/M00/00/00/CgAIC2M2i-6AR4wcAAAAED0JP-g793_big.txt
单机图片服务器搭建成功!!!!
集群可依据配置自行修改。。。。。。。。。
######非必要
# fastdfs删除后页面还有缓存的解决方法
# 在nginx中配置
location ~ /M00
root /data/fast_data/data;
ngx_fastdfs_module;
add_header Cache-Control no-store;
附录
防火墙相关命令
防火墙开关
查询防火墙状态
firewall-cmd --state
关闭防火墙
systemctl stop firewalld
启动防火墙
systemctl start firewalld
重启防火墙(添加端口后一定要重启防火墙)
firewall-cmd --reload
端口开关
查看端口开放列表
firewall-cmd --list-ports
开放80端口
firewall-cmd --permanent --zone=public --add-port=80/tcp
查询80端口是否开放
firewall-cmd --query-port=80/tcp
移除8080端口
firewall-cmd --permanent --remove-port=8080/tcp
查询所有端口对应的服务
netstat -ntlp
windows防火墙命令
- 以管理员身份打开cmd
关闭防火墙
netsh firewall set opmode mode=disable
netsh advfirewall set allprofiles state off
查看防火墙状态
netsh advfirewall show allprofiles
防火墙恢复默认配置
netsh firewall reset
代码
- 后续会补充整体初级代码下载地址
结构
依赖
<!--fastdfs-->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.1-RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs‐client‐java -->
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
serviceImpl
public List<String> finalDocumentList1(MultipartFile[] files)
//返回地址列表(可访问)
List<String> list = new ArrayList<>();
for (int i = 0; i < files.length; i++)
MultipartFile file = files[i];
//可访问路径
StringBuilder filePath = new StringBuilder();
//file的storagePath,ext_Name[i]
String SP_file = upload1(file);
if(SP_file.equals("false"))
return null;
//拼接返回的图片地址的ip地址
filePath.append("http://").append(path).append(":").append(port).append("/");
//拼接返回图片的存储地址
filePath.append(SP_file);
//拼接file的浏览器可访问地址
// System.out.println("这里是第" + i + "个file可访问路径:" + filePath);
list.add(filePath.toString());
return list;
public String upload1(MultipartFile multipartFile)
if (!multipartFile.isEmpty())
try
//加载fastDFS客户端的配置文件
ClientGlobal.initByProperties("config/fastDfs-client.properties");
//创建tracker的客户端
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
//定义storage的客户端
StorageClient1 client = new StorageClient1(trackerServer, null);
String file_Name = Objects.requireNonNull(multipartFile.getOriginalFilename()).split("\\\\.")[0];
String ext_file = Objects.requireNonNull(multipartFile.getOriginalFilename()).split("\\\\.")[1];
byte[] byteFile = multipartFile.getBytes();
//文件元信息
NameValuePair[] metaList = new NameValuePair[1];
metaList[0] = new NameValuePair("fileName", file_Name + "." + ext_file);
//通过文件字节流执行上传
String fileId = client.upload_file1(byteFile, ext_file, metaList);
//System.out.println("upload success. file id is: " + fileId);
//关闭trackerServer的连接
trackerServer.close();
return fileId;
catch (IOException | MyException e)
e.printStackTrace();
return "false";
测试下载和删除
//文件下载
@Test
public void download()
try
//加载fastDFS客户端的配置 文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
//创建tracker的客户端
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
//定义storage的客户端
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
byte[] bytes = client.download_file1("group1/M00/00/00/CgAIC2M9RAiAClvdAA6aHcaNQII186.jpg");
File file = new File("D:/用户/桌面/picture/GPUCache/ew.jpg");
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(bytes);
fileOutputStream.close();
//关闭trackerServer的连接
trackerServer.close();
catch (Exception ex)
ex.printStackTrace();
//文件删除
@Test
public void deleteDocument()
try
//加载fastDFS客户端的配置 文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
//创建tracker的客户端
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
//定义storage的客户端
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
// byte[] bytes = client.download_file1("group1/M00/00/00/CgAIC2M9RAiAClvdAA6aHcaNQII186.jpg");
int i = client.delete_file1("group1/M00/00/00/CgAIC2M9RAiAClvdAA6aHcaNQII186.jpg");
//0为删除成功,2为未找到该文件,其他为删除文件异常
System.out.println("状态码::::::::" + i);
//关闭trackerServer的连接
trackerServer.close();
catch (Exception ex)
ex.printStackTrace();
以上是关于图片服务器部署(docker部署和分离部署)的主要内容,如果未能解决你的问题,请参考以下文章
基于Docker-Compose 部署前后端分离单体项目(一)
项目部署Vue+SpringBoot前后分离个人博客项目实战部署保姆教程 Linux+docker安装部署启动一条龙教程
(Docker Nginx) Spring boot+Vue 前后端分离部署 详细完整版