阿里云使用docker-compose 部署fastdfs+nginx分布式文件存储系统

基本环境 :docker、docker-compose、go环境
go服务开发:beego插件,fdfsclient插件、dep包管理工具

文章目录

  • 安装docker
  • 按照docker-compose
  • 编写docker-compose.yaml
  • 修改配置
  • 启动docker-compose
  • 测试
  • GO开发文件服务系统
    • 编写go服务端
  • git
  • 阿里云服务器添加安全组
  • 服务测试
  • 优化
  • 注意
  • 代码
  • 优化

安装docker

参考官方文档
https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce

按照docker-compose

参考官方文档
https://docs.docker.com/compose/install/

编写docker-compose.yaml

根目录下新建 fdfs文件夹,存储所有相关文件

root@iZ2ze09b1yvldidp6smc5mZ:cd /
root@iZ2ze09b1yvldidp6smc5mZ:mkdir fdfs
root@iZ2ze09b1yvldidp6smc5mZ:cd fdfs
# 查看主机ip
root@iZ2ze09b1yvldidp6smc5mZ:/fdfs# ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.155.85 记住此地址  netmask 255.255.240.0  broadcast 172.17.159.255
        ether 00:16:3e:12:87:31  txqueuelen 1000  (Ethernet)
        RX packets 173361  bytes 157497623 (157.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 132515  bytes 110226564 (110.2 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 21200  bytes 2851615 (2.8 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21200  bytes 2851615 (2.8 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

注意地址改为服务器地址

root@iZ2ze09b1yvldidp6smc5mZ:/fdfs# vim docker-compose.yml 
version: '2'
services:
  tracker:
    image: season/fastdfs:1.2
    restart: always
    volumes:
      - "/etc/timezone:/etc/timezone:ro"
      - "/etc/localtime:/etc/localtime:ro"
      - "./tracker_data:/fastdfs/tracker/data"
    network_mode: "host"
    command: "tracker" 
 
  storage:
    image: season/fastdfs:1.2
    restart: always
    volumes:
      - "/etc/timezone:/etc/timezone:ro"
      - "/etc/localtime:/etc/localtime:ro"
      - "./storage_base_path:/fastdfs/storage/data"
      - "./store_path0:/fastdfs/store_path"  
    environment:
    // tracker 地址,我用的单机,都是一个主机
      TRACKER_SERVER: "172.17.155.85:22122"
    network_mode: "host"
    command: "storage"
 
  nginx:
    image: season/fastdfs:1.2
    restart: always
    volumes:
      - "/etc/timezone:/etc/timezone:ro"
      - "/etc/localtime:/etc/localtime:ro"
      - "./nginx.conf:/etc/nginx/conf/nginx.conf"
      - "./store_path0:/fastdfs/store_path"
    environment:
    // nginx 地址,我用的单机,都是一个主机
      TRACKER_SERVER: "172.17.155.85:22122"
    network_mode: "host"
    command: "nginx"

修改配置

由于storege的服务默认的配置文件地址为作者的地址,需要需改

在/fdfs下新建文件 storage.conf
内容

root@iZ2ze09b1yvldidp6smc5mZ:/fdfs# vim storage.conf 
# is this config file disabled
# false for enabled
# true for disabled
disabled=false

# the name of the group this storage server belongs to
group_name=group1
#默认组1即可,如果多个store 就写group2,一次类推


# path(disk or mount point) count, default value is 1
store_path_count=1

# store_path#, based 0, if store_path0 not exists, it's value is base_path
# the paths must be exist
store_path0=/fastdfs/store_path 
#数据存储地址
#store_path1=/home/yuqing/fastdfs2

# subdir_count  * subdir_count directories will be auto created under each 
# store_path (disk), value can be 1 to 256, default value is 256
subdir_count_per_path=256

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address
tracker_server=172.17.155.85:22122 修改为tracker地址,单机修改本机即可
...
...
...
# the port of the web server on this storage server
http.server_port=8888

修改nginx配置

root@iZ2ze09b1yvldidp6smc5mZ:/fdfs# cat nginx.conf 
#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    #access_log  logs/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    #gzip  on;
 
    server {
        listen       8088;
        server_name  localhost;
 
        #charset koi8-r;
 
        #缩略图需要使用插件,需要单独构建nginx镜像,此处忽略
        #location /group([0-9])/M00/.*\.(gif|jpg|jpeg|png)$ {
         #   root /fastdfs/storage/data;
         #   image on;
         #   image_output off;         
         #   image_jpeg_quality 75;
         #   image_backend off;
        #    image_backend_server http://baidu.com/docs/aabbc.png;
       # }
       
        # group1
        location /group1/M00 {
        # 文件存储目录
            root /fastdfs/storage/data;
            ngx_fastdfs_module;
        }
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 }
}

最终为

root@iZ2ze09b1yvldidp6smc5mZ:/fdfs# ls
docker-compose.yml  nginx.conf    storage.conf  store_path0  

启动docker-compose

docker-compose up -d

如果本地没有镜像,耐心等待。阿里云服务器 5分钟左右

启动后查看

root@iZ2ze09b1yvldidp6smc5mZ:/fdfs# docker-compose ps
     Name               Command           State   Ports
-------------------------------------------------------
fdfs_nginx_1     /entrypoint.sh nginx     Up           
fdfs_storage_1   /entrypoint.sh storage   Up           
fdfs_tracker_1   /entrypoint.sh tracker   Up  

root@iZ2ze09b1yvldidp6smc5mZ:/fdfs# ls
docker-compose.yml  nginx.conf  storage_base_path  storage.conf  store_path0  tracker_data

测试

进入docker

root@iZ2ze09b1yvldidp6smc5mZ:/fdfs# docker exec -it fdfs_storage_1 bash
root@iZ2ze09b1yvldidp6smc5mZ:/# cd /fdfs_conf/
root@iZ2ze09b1yvldidp6smc5mZ:/fdfs_conf# ls
anti-steal.jpg  client.conf  http.conf  mime.types  mod_fastdfs.conf  storage.conf  storage_ids.conf  tracker.conf
root@iZ2ze09b1yvldidp6smc5mZ:/fdfs_conf# cat storage.conf 

查看tracker地址,如果错误,请修改主机中的 storage.conf后重启docker-compose

store_path0=/fastdfs/store_path
#  "host:port", host can be hostname or ip address
tracker_server=172.17.155.85:22122

conf目录内有测试文件

root@iZ2ze09b1yvldidp6smc5mZ:/fdfs_conf# fdfs_upload_file storage.conf anti-steal.jpg 
group1/M00/00/00/rBGbVVzWxz2AEx3CAABdrZgsqUU180.jpg

查看上传文件

root@iZ2ze09b1yvldidp6smc5mZ:/fdfs_conf# ls /fastdfs/store_path/data/00/00/  
rBGbVVzWxz2AEx3CAABdrZgsqUU180.jpg
root@iZ2ze09b1yvldidp6smc5mZ:/fdfs_conf# 

如果开启外网可以进行查看(nginx:8088)
http://主机ip:nginx端口/group1/M00/00/00/rBGbVVzWxz2AEx3CAABdrZgsqUU180.jpg
阿里云使用docker-compose 部署fastdfs+nginx分布式文件存储系统_第1张图片

GO开发文件服务系统

html前端测试页面,就一个上传action

阿里云使用docker-compose 部署fastdfs+nginx分布式文件存储系统_第2张图片

编写go服务端

使用包管理工具dep
三方插件使用beego、fdfs_client
新建项目

bee new uploadserver
ce uploadserver
dep init

添加路由

func init() {
	//beego.Router("/", &controllers.MainController{})
	beego.Router("/upload", &controllers.UploadController{})
	beego.Router("/download", &controllers.DownloadController{})// 没用到,直接通过urlget即可
}

添加控制器


var (
	// fdfs客户端
	fdfsClient *fdfs_client.FdfsClient
)

type UploadController struct {
	beego.Controller
}

func (c *UploadController) Get() {
	c.TplName = "upload.tpl"
}

func (c *UploadController) Post() {
	resp := make(map[string]interface{})

	f, h, _ := c.GetFile("file") //获取上传的文件
	// 获取文件后缀名
	ext := path.Ext(h.Filename) 
	//验证后缀名合法
	AllowExtMap := map[string]bool{
		".jpg":  true,
		".jpeg": true,
		".png":  true,
	}
	if _, ok := AllowExtMap[ext]; !ok {
		resp["code"] = conf.RECODE_EXTERR
		resp["msg"] = conf.RecodeText(conf.RECODE_EXTERR)
		c.Ctx.ResponseWriter.Write(toJsonResp(resp))
		// 错误返回json
		return
	}

	// 获取数据
	fbuf, err := ioutil.ReadAll(f)
	if err != nil {
		fmt.Println("读取参数错误", err)
		resp["code"] = conf.RECODE_REQERR
		resp["msg"] = conf.RecodeText(conf.RECODE_REQERR)
		c.Ctx.ResponseWriter.Write(toJsonResp(resp))
		return
	}

	// 上传文件,后缀名需要去除前面的. 否则存储文件为***..jpg,不过不影响
	g, id, err := uploadByBuffer(fbuf, ext[1:])

	if err != nil {
		fmt.Println(err)
		resp["code"] = conf.RECODE_DATAERR
		resp["msg"] = conf.RecodeText(conf.RECODE_DATAERR)
		beego.Info("upload err", err)
	} else {
		resp["code"] = conf.RECODE_OK
		// 成功返回id,id需要拼接服务器url
		resp["data"] = utils.AddDomain2Url(id)
		beego.Info("upload a file", g, id)
	}
	// 返回json数据
	c.Ctx.ResponseWriter.Write(toJsonResp(resp))
	return
}

func uploadByBuffer(fileBuffer []byte, fileExt string) (g, id string, err error) {

	// 获取客户端
	if fdfsClient == nil {
	// tracker已有连接池 默认10,最大15,如果过多请求,阻塞,请自行设置
		fdfsClient, err = fdfs_client.NewFdfsClient("./conf/client.conf")
		if err != nil {
			return "", "", err
		}
	}

	// 上传
	resp, err := fdfsClient.UploadByBuffer(fileBuffer, fileExt)
	if err != nil {
		return "", "", err
	}
	return resp.GroupName, resp.RemoteFileId, nil
}

git

开发机,服务目录 git init,上传到github
服务器,搭建go环境,下载项目到gopath下

或者直接拷贝 编译后的可执行文件到 服务器也可以。

阿里云服务器添加安全组

开放文件系统需要的端口
上传服务8081,图片nginx 8088。端口自行定义

阿里云使用docker-compose 部署fastdfs+nginx分布式文件存储系统_第3张图片

服务测试

上传非法文件
在这里插入图片描述
页面返回

{"code":"4601","msg":"格式错误"}

再次选择上传图片文件
返回

{"code":"0","data":"http://39.106.165.***:8088/group1/M00/00/00/rBGbVVzWzGOAGxHoAANiw7DpuOI574.jpg"}

得到链接,浏览器查看
阿里云使用docker-compose 部署fastdfs+nginx分布式文件存储系统_第4张图片

优化

多storeage
多tracker

注意

使用dep工具下载插件,或者go get后 dep ensure
阿里云使用docker-compose 部署fastdfs+nginx分布式文件存储系统_第5张图片

代码

https://github.com/bigsui/uploadserver

优化

缩略图(build 待缩略插件的nginx)
多group、tracker(修改配置)
自行开发

你可能感兴趣的:(go)