FastDFS 容器化安装实践

FastDFS 容器化安装

环境变量

新增 .env 文件如下:

HOSTNAME_COMMAND=xxx.xxx.xxx.xxx

其中,xxx.xxx.xxx.xxx 为 服务器 IP 地址。

nginx.conf 配置

nginx.conf 文件增加配置如下:

location /group1/M00 {
	root /fastdfs/storage/data;
	ngx_fastdfs_module;
}

docker-compose

docker-compose.yml 文件如下:

version: '2'
services:
    fastdfs-tracker:
        hostname: fastdfs-tracker
        container_name: fastdfs-tracker
        image: season/fastdfs:1.2
        network_mode: "host"
        command: tracker
        volumes:
          - ./data/tracker_data:/fastdfs/tracker/data
    fastdfs-storage:
        hostname: fastdfs-storage
        container_name: fastdfs-storage
        image: season/fastdfs:1.2
        network_mode: "host"
        volumes:
          - ./data/storage_data:/fastdfs/storage/data
          - ./data/store_path:/fastdfs/store_path
        environment:
          - TRACKER_SERVER=${HOSTNAME_COMMAND}:22122
        command: storage
        depends_on:
          - fastdfs-tracker
    fastdfs-nginx:
        hostname: fastdfs-nginx
        container_name: fastdfs-nginx
        image: season/fastdfs:1.2
        network_mode: "host"
        volumes:
          - ./nginx.conf:/etc/nginx/conf/nginx.conf
          - ./data/store_path:/fastdfs/store_path
        environment:
          - TRACKER_SERVER=${HOSTNAME_COMMAND}:22122
        command: nginx

需要注意:

  • network_mode 必须是 host, 原因是当上传文件时,tracker 会把 storage 的 IP 和端口发给 client,如果是 bridge 模式,则发送的是内网 IP,client 无法访问到。
  • image 采用 season/fastdfs:1.2 ,不要用 lastest, 因为 lastest 不包含 nginx 服务,其他 fasdfs 镜像均没有 season 的精简。

测试 FastDFS

命令行测试上传

$ fdfs_upload_file /etc/fdfs/client.conf /home/ant/test 
group1/M00/00/00/CqD3YF3kwS-ACYbMAAAAHDDhFHI6820520

命令行测试下载:

$ fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/CqD3YF3kwS-ACYbMAAAAHDDhFHI6820520

http 测试下载:

wget http://xxx.xxx.xxx.xxx/group1/M00/00/00/CmmIP19sbZ6ABzkBAAAXTnaiWqo2684096?filename=testfile

访问 FastDFS

其他容器如需按照域名访问 FastDFS,可增加配置:

web-admin:
   container_name: web-admin
   extra_hosts:
       - "fastdfs.manti-infra.svc:${HOSTNAME_COMMAND}"

问题处理

问题一

报错问题:

[error] 13#0: *1 open() "/etc/nginx/html/group1/M00/00/00/CmmIP19sbZ6ABzkBAAAXTnaiWqo2684096" failed (2: No such file or directory)

修复:修改 nginx.conf 中的 location 配置为:

location/group1/M00/ {
	alias /fastdfs/store_path/data;
	ngx_fastdfs_module;
}

问题二

报错问题:

ERROR - file: ../common/fdfs_global.c, line:52, the format of filename
"group1/M00/00/00/wKgAA1cLh12AI0kfAAAADzbdjmQ50_big.html"is invalid

原因:nginx 的 fdfs 的 MOD 里面默认没有开启 url_have_group_name

修复:开启 mod_fastdfs.conf 文件中的 url_have_group_name 选项,后重启 nginx

问题三

/usr/src/fastdfs-nginx-module/src/common.c:21:25:致命错误:fdfs_define.h:没有那个文件或目录
#include "fdfs_define.h" 
编译中断。

原因:编译安装 nginx 的 fastdfs 插件的头文件没有找到,由于编译 nginx 时候系统会到/usr/local/include,而编译安装 fastdfs-nginx-module 时则默认保存在了 /usr/include 目录。

修复:ln -s /usr/include/fast* /usr/local/include/

问题四

Nginx 启动后 error.log 日志报错

ERROR - file:../storage/trunk_mgr/trunk_shared.c, line: 177, "No such file ordirectory" can't be accessed, error info: /data/fastdfs

原因:nginx 的 fdfs 插件没有在 /etc/fdfs 目录中找到 http.conf 和 mime.types。

修复:复制或者创建对应文件的软连接
cp/usr/local/FastDFS/conf/http.conf /etc/fdfs/
cp/usr/local/FastDFS/conf/mime.types /etc/fdfs/

问题五

页面访问动态缩略图返回 415

原因:

  • 首先需要排除文件类型的问题,image_filter 只支持 jpg、git 和 png 三种格式的图片文件,调用其他格式的 图片文件 会返回 415。
  • 其次要确认设置的 image_filter 缓存是否小于上传的图片大小,如果小于同样会报 415 错误。

如果排除以上两种可能性,那么出现的问题应该是没有在 Nginx 页面的 DocumentRoot 目录创建 FastDFS 数据存储的软连接。

修复:执行下列命令创建软连接:

# mkdir -pv/usr/local/nginx/html/group1
# ln -s /data/fastdfs_store/data/usr/local/nginx/html/group1/M00

参考资料

  • https://www.cnblogs.com/yloved/p/12649569.html
  • https://developer.aliyun.com/article/545016