图片服务器部署(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: 可以看到文件内有我们需要的trackerstorage以及用于测试的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 前后端分离部署 详细完整版

docker-compose 部署 Vue+SpringBoot 前后端分离项目

Docker 容器分离部署LNMP架构

docker部署django项目mysql主从搭建django实现读写分离