基本环境 :docker、docker-compose、go环境
go服务开发:beego插件,fdfsclient插件、dep包管理工具
参考官方文档
https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce
参考官方文档
https://docs.docker.com/compose/install/
根目录下新建 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 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
html前端测试页面,就一个上传action
使用包管理工具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 init,上传到github
服务器,搭建go环境,下载项目到gopath下
或者直接拷贝 编译后的可执行文件到 服务器也可以。
开放文件系统需要的端口
上传服务8081,图片nginx 8088。端口自行定义
{"code":"4601","msg":"格式错误"}
再次选择上传图片文件
返回
{"code":"0","data":"http://39.106.165.***:8088/group1/M00/00/00/rBGbVVzWzGOAGxHoAANiw7DpuOI574.jpg"}
多storeage
多tracker
使用dep工具下载插件,或者go get后 dep ensure
https://github.com/bigsui/uploadserver
缩略图(build 待缩略插件的nginx)
多group、tracker(修改配置)
自行开发