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