文章目录
- [FastDFS 简介](#FastDFS 简介)
- [FastDFS 的核心组成](#FastDFS 的核心组成)
- [为什么要用 FastDFS](#为什么要用 FastDFS)
- 环境与软件准备
- 软件包准备
- 安装与配置
- 安装基础依赖
-
- [安装 libfastcommon](#安装 libfastcommon)
- [安装 libserverframe(6.09+ 必须安装)](#安装 libserverframe(6.09+ 必须安装))
- [安装 FastDFS](#安装 FastDFS)
- [安装 fastdfs-nginx-module 模块](#安装 fastdfs-nginx-module 模块)
- [编译安装 Nginx](#编译安装 Nginx)
- 配置与启动
- Dockerfile编写
- docker+k8s启动
- 测试
- 常见问题
- 总结与建议
FastDFS 简介
FastDFS 是一款开源的分布式文件存储系统,由淘宝资深架构师余庆开发并维护。它专门针对互联网海量小文件存储而设计,支持高性能的文件上传、下载以及文件同步功能。
FastDFS 的核心组成
FastDFS 主要由三个角色组成:
-
Tracker(跟踪服务器)
管理 Storage 节点,提供文件上传、下载的路由功能,类似"目录服务"。
-
Storage(存储服务器)
负责实际的文件存储和访问,每个 Storage 节点可以划分多个 group(组)。
-
Client(客户端)
通过 SDK 或命令行与 Tracker 通信,实现文件上传和下载。
为什么要用 FastDFS
- 适用于 海量小文件 存储,例如图片、音视频、日志文件。
- 分布式、可横向扩展。
- 自动同步与负载均衡,无需额外配置。
- 相比传统 NFS,性能和可用性更优。
本文演示的是 FastDFS 6.11.0 单机环境搭建,适合本地开发与功能验证,生产环境建议使用集群部署。
环境与软件准备
组件 | 版本 | 说明 |
---|---|---|
FastDFS | 6.11.0 | 文件存储核心服务 |
FastDFS-Nginx-Module | 1.24 | Nginx 模块,用于 HTTP 文件访问 |
libfastcommon | 1.0.71 | FastDFS 依赖库 |
libserverframe | 1.2.1 | FastDFS 6.09+ 必须依赖库 |
Nginx | 1.24.0 | 作为文件访问的 Web 服务器 |
系统 | Rocky 9.2 (Blue Onyx)/7.9 | 其他 Linux 发行版类似 |
注:
目前博主用过两个系统部署,都成功起来了
- centos7.9.2009
- Rocky Linux release 9.2 (Blue Onyx)
软件包准备
- libfastcommon-1.0.71.tar.gz
- libserverframe-1.2.1.tar.gz
- fastdfs-6.11.0.tar.gz
- fastdfs-nginx-module-1.24.tar.gz
- nginx-1.24.0.tar.gz
csdn包下载
文件名 | 说明 |
---|---|
docker-compose.yml | Docker Compose 配置文件,用于快速编排并启动 FastDFS 服务。 |
Dockerfile | 自定义镜像构建文件,定义 FastDFS + Nginx 的构建步骤。 |
entrypoint.sh | 容器启动脚本,负责启动 tracker、storage 服务及 Nginx。 |
fastdfs-6.11.0.tar.gz | FastDFS 核心源码包,提供 tracker、storage、client 功能。 |
fastdfs-nginx-module-1.24.tar.gz | FastDFS 的 Nginx 模块源码包,用于文件的 HTTP 访问。 |
k8s-storage.yaml | Kubernetes Storage 部署配置文件。 |
k8s-tracker.yaml | Kubernetes Tracker 部署配置文件。 |
libfastcommon-1.0.71.tar.gz | FastDFS 所需的公共函数库,必须先安装。 |
libserverframe-1.2.1.tar.gz | FastDFS 所需的服务器框架库,部分新版本依赖该库。 |
mod_fastdfs.conf | FastDFS Nginx 模块配置文件,定义 group 名称、tracker 地址及文件访问映射。 |
nginx-1.24.0.tar.gz | Nginx 源码包,用于编译并集成 FastDFS 模块。 |
nginx.conf | Nginx 主配置文件,用于加载 FastDFS 模块和文件访问规则。 |
storage.conf | Storage 服务配置文件,定义存储路径、tracker 地址及端口等。 |
tracker.conf | Tracker 服务配置文件,定义 tracker 的监听端口、日志路径、存储调度策略等。 |
client.conf | FastDFS 客户端配置文件,用于客户端上传、下载文件时指定 Tracker 服务及本地日志目录。 |
安装与配置
安装基础依赖
bash
yum install -y epel-release
yum install -y git gcc gcc-c++ make wget pcre pcre-devel zlib zlib-devel openssl openssl-devel vim && \
yum clean all
安装 libfastcommon
FastDFS 依赖的公共函数库
bash
tar xf libfastcommon-1.0.71.tar.gz -C /usr/local/
cd /usr/local/libfastcommon-1.0.71/
./make.sh
./make.sh install
安装 libserverframe(6.09+ 必须安装)
bash
tar xf libserverframe-1.2.1.tar.gz -C /usr/local/
cd /usr/local/libserverframe-1.2.1/
./make.sh
./make.sh install
安装 FastDFS
bash
tar xf fastdfs-6.11.0.tar.gz -C /usr/local/
cd /usr/local/fastdfs-6.11.0/
./make.sh
./make.sh install
安装完成后,主要的配置文件位于 /etc/fdfs
。
安装 fastdfs-nginx-module 模块
bash
tar xf fastdfs-nginx-module-1.24.tar.gz -d /usr/local/
cd /usr/local/fastdfs-nginx-module-1.24/
sed -i 's#local/##g' src/config
编译安装 Nginx
bash
tar -xf /usr/local/nginx-1.24.0.tar.gz -C /usr/local/
cd /usr/local/nginx-1.24.0
./configure --prefix=/usr/local/nginx --with-http_ssl_module --add-module=/usr/local/fastdfs-nginx-module-1.24/src
make
make install
配置与启动
Tracker
或者直接看下边tracker.conf
bash
cd /etc/fdfs/
vi tracker.conf
# 配置关键项
base_path = /var/fastdfs
创建目录并启动:
bash
mkdir -p /var/fastdfs
# 启动
fdfs_trackerd /etc/fdfs/tracker.conf start
# 检查
ps aux | grep tracker
bash
# 重启
fdfs_trackerd /etc/fdfs/tracker.conf restart
# 停止
fdfs_trackerd /etc/fdfs/tracker.conf stop
# 状态
fdfs_trackerd /etc/fdfs/tracker.conf status
# 查看版本
fdfs_trackerd /etc/fdfs/tracker.conf -V
# 帮助
fdfs_trackerd /etc/fdfs/tracker.conf -h
Storage
或者直接看下边storage.conf
bash
cd /etc/fdfs/
vi storage.conf
base_path = /var/fastdfs
group_name = group1
store_path0 = /var/fastdfs
tracker_server = 192.168.1.2:22122
创建目录并启动:
bash
mkdir -p /var/fastdfs
# 启动
fdfs_storaged /etc/fdfs/storage.conf start
# 查看进程
ps aux | grep storage
bash
# 重启
fdfs_storaged /etc/fdfs/storage.conf restart
# 停止
fdfs_storaged/etc/fdfs/storage.conf stop
# 状态
fdfs_storaged /etc/fdfs/storage.conf status
# 查看版本
fdfs_storaged/etc/fdfs/storage.conf -V
# 帮助
fdfs_storaged/etc/fdfs/storage.conf -h
Client 配置与测试上传
bash
cd /etc/fdfs/
vi client.conf
base_path = /var/fastdfs
tracker_server = 192.168.1.2:22122
创建目录并测试:
bash
mkdir -p /var/fastdfs
fdfs_test /etc/fdfs/client.conf upload ./01.png
nginx 配置启动
可以直接复制下边的nginx.conf
复制 FastDFS 配置:
bash
cp /usr/local/fastdfs-6.11.0/conf/http.conf /etc/fdfs/
cp /usr/local/fastdfs-6.11.0/conf/mime.types /etc/fdfs/
bash
# 启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
插个图片,这是/etc/fdfs下所有文件
storage_ids.conf 这个是启动后生成的,其他配置博文都有
Dockerfile编写
注:
自行变更配置文件,不变更也可以
首先所有软件放到同一个目录下,再linux下进行的
文件名 | 说明 |
---|---|
Dockerfile | 用于构建 FastDFS + Nginx 镜像的核心文件,定义了基础镜像、依赖安装及环境变量等。 |
entrypoint.sh | 容器启动脚本,通常用于启动 tracker 或 storage 服务,并可附加执行 Nginx、日志输出等命令。 |
fastdfs-6.11.0.tar.gz | FastDFS 的核心程序源码包,提供 tracker、storage、client 的核心功能。 |
libfastcommon-1.0.71.tar.gz | FastDFS 运行所依赖的公共函数库,必须先安装。 |
libserverframe-1.2.1.tar.gz | FastDFS 所需的服务器框架库,部分新版本依赖该库。 |
nginx-1.24.0.tar.gz | Nginx 源码包,用于编译并集成 FastDFS 模块。 |
fastdfs-nginx-module-1.24.tar.gz | Nginx 的 FastDFS 模块源码包,用于实现 FastDFS 文件的 Web 访问。 |
tracker.conf | Tracker 服务的配置文件,用于定义 tracker 的监听端口、日志路径、存储调度策略等。 |
storage.conf | Storage 服务的配置文件,指定存储路径、Tracker 地址、端口及存储策略。 |
client.conf | FastDFS 客户端配置文件,用于客户端上传、下载文件时指定 Tracker 服务及本地日志目录。。 |
mod_fastdfs.conf | Nginx FastDFS 模块的配置文件,定义 group 名称、tracker 地址及文件访问路径映射规则。 |
nginx.conf | Nginx 的主配置文件,需在其中加载 FastDFS 模块并配置文件访问规则。 |
Dockerfile
Dockerfile
FROM docker.wctmd.us.kg/centos:centos7.9.2009
LABEL maintainer="XMYX-0" \
version="1.0" \
description="FastDFS 6.11.0 + Nginx 1.24 + fastdfs-nginx-module 1.24"
WORKDIR /usr/local
# 替换国内阿里云镜像源
RUN cd /etc/yum.repos.d/ && \
sed -i.bak 's|^mirrorlist=|#mirrorlist=|g' CentOS-*.repo && \
sed -i.bak 's|^#baseurl=http://mirror.centos.org|baseurl=http://mirrors.aliyun.com|g' CentOS-*.repo && \
yum clean all && yum makecache
# 1. 安装基础依赖
RUN yum install -y epel-release && \
yum install -y git gcc gcc-c++ make wget pcre pcre-devel zlib zlib-devel openssl openssl-devel vim && \
yum clean all
# 2. 拷贝源码文件(提前放到 Docker 构建上下文)
COPY libfastcommon-1.0.71.tar.gz .
COPY libserverframe-1.2.1.tar.gz .
COPY fastdfs-6.11.0.tar.gz .
COPY fastdfs-nginx-module-1.24.tar.gz .
COPY nginx-1.24.0.tar.gz .
# 3. 编译安装 libfastcommon
RUN tar xf libfastcommon-1.0.71.tar.gz -C /usr/local/ && \
cd /usr/local/libfastcommon-1.0.71 && \
./make.sh && ./make.sh install
# 4. 编译安装 libserverframe
RUN tar xf libserverframe-1.2.1.tar.gz -C /usr/local/ && \
cd /usr/local/libserverframe-1.2.1 && \
./make.sh && ./make.sh install
# 5. 编译安装 FastDFS
RUN tar xf fastdfs-6.11.0.tar.gz -C /usr/local/ && \
cd /usr/local/fastdfs-6.11.0 && \
./make.sh && ./make.sh install && \
mkdir -p /opt/fastdfs/{tracker,storage/log,storage/file,tmp,client}
# 6. 编译安装 Nginx + fastdfs-nginx-module
RUN tar xf fastdfs-nginx-module-1.24.tar.gz -C /usr/local/ && \
cd /usr/local/fastdfs-nginx-module-1.24 && \
sed -i 's#local/##g' src/config && \
tar -xf /usr/local/nginx-1.24.0.tar.gz -C /usr/local/ && \
cd /usr/local/nginx-1.24.0 && \
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--add-module=/usr/local/fastdfs-nginx-module-1.24/src && \
make && make install
# 7. 配置 FastDFS & Nginx (先拷贝默认配置文件,支持后期通过挂载覆盖)
RUN cp /usr/local/fastdfs-6.11.0/conf/* /etc/fdfs/ && \
cp /usr/local/fastdfs-nginx-module-1.24/src/mod_fastdfs.conf /etc/fdfs/ && \
cp /usr/local/fastdfs-6.11.0/conf/http.conf /etc/fdfs/ && \
cp /usr/local/fastdfs-6.11.0/conf/mime.types /etc/fdfs/
COPY tracker.conf /etc/fdfs/tracker.conf
COPY storage.conf /etc/fdfs/storage.conf
COPY client.conf /etc/fdfs/client.conf
COPY mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
# 8. 暴露端口
EXPOSE 22122 23000 80
# 9. 数据卷挂载
# VOLUME ["/opt/fastdfs/tracker", "/opt/fastdfs/storage"]
# 10. 启动脚本
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
CMD ["/entrypoint.sh"]
# 11. 清理无用文件
RUN rm -rf /usr/local/*.tar.gz
# 在编译安装后删除源码压缩包和解压目录
#RUN rm -rf /usr/local/libfastcommon-1.0.71* \
# /usr/local/libserverframe-1.2.1* \
# /usr/local/fastdfs-6.11.0* \
# /usr/local/fastdfs-nginx-module-1.24* \
# /usr/local/nginx-1.24.0* \
# /usr/local/*.tar.gz
nginx.conf
conf
user root;
worker_processes 1;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
keepalive_timeout 65;
client_max_body_size 100M;
server {
listen 8888;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location ~/group([0-9])/M00 {
ngx_fastdfs_module;
}
}
}
entrypoint.sh
bash
#!/bin/bash
set -e
### 1. 默认环境变量设置 ###
: ${FASTDFS_BASE_PATH:=/var/fdfs}
: ${GROUP_NAME:=group1}
: ${PORT:=22122}
: ${TRACKER_SERVER:=127.0.0.1:22122}
FASTDFS_MODE="tracker" # 默认运行 tracker
LOG_DIR="${FASTDFS_BASE_PATH}/logs"
mkdir -p "${LOG_DIR}"
### 2. 解析模式参数 ###
case "$1" in
tracker)
FASTDFS_MODE="tracker"
;;
storage)
FASTDFS_MODE="storage"
;;
monitor)
sed -i "s|tracker_server=.*$|tracker_server=${TRACKER_SERVER}|g" /etc/fdfs/client.conf
exec fdfs_monitor /etc/fdfs/client.conf
;;
all)
FASTDFS_MODE="all"
;;
*)
echo "Usage: $0 {tracker|storage|monitor|all}"
exit 1
;;
esac
### 3. 配置文件动态替换 ###
if [ "$FASTDFS_MODE" = "storage" ] || [ "$FASTDFS_MODE" = "all" ]; then
sed -i "s|store_path0.*$|store_path0=/var/fdfs|g" /etc/fdfs/mod_fastdfs.conf
sed -i "s|url_have_group_name =.*$|url_have_group_name = true|g" /etc/fdfs/mod_fastdfs.conf
fi
if [ "$FASTDFS_MODE" != "all" ]; then
# tracker 或 storage 模式
sed -i "s|^port=.*$|port=${PORT}|g" /etc/fdfs/${FASTDFS_MODE}.conf
sed -i "s|tracker_server=.*$|tracker_server=${TRACKER_SERVER}|g" /etc/fdfs/storage.conf
sed -i "s|tracker_server=.*$|tracker_server=${TRACKER_SERVER}|g" /etc/fdfs/client.conf
sed -i "s|tracker_server=.*$|tracker_server=${TRACKER_SERVER}|g" /etc/fdfs/mod_fastdfs.conf
sed -i "s|group_name=.*$|group_name=${GROUP_NAME}|g" /etc/fdfs/storage.conf
sed -i "s|group_name=.*$|group_name=${GROUP_NAME}|g" /etc/fdfs/mod_fastdfs.conf
fi
### 4. 启动服务并记录日志文件 ###
start_service() {
local mode=$1
local conf="/etc/fdfs/${mode}.conf"
local log_file="${LOG_DIR}/${mode}d.log"
local pid_file="${FASTDFS_BASE_PATH}/data/fdfs_${mode}d.pid"
echo "Starting ${mode} service..."
# ✅ 清理遗留 PID 文件(关键)
[ -f "$pid_file" ] && echo "Removing old pid: $pid_file" && rm -f "$pid_file"
[ -f "$log_file" ] && echo "Removing old log: $log_file" && rm -f "$log_file"
fdfs_${mode}d "$conf" start
}
### 5. 优雅停止处理 ###
stop_service() {
echo "Stopping services..."
if [ "$FASTDFS_MODE" = "all" ]; then
fdfs_storaged /etc/fdfs/storage.conf stop || true
fdfs_trackerd /etc/fdfs/tracker.conf stop || true
else
fdfs_${FASTDFS_MODE}d /etc/fdfs/${FASTDFS_MODE}.conf stop || true
fi
/usr/local/nginx/sbin/nginx -s quit || true
exit 0
}
trap stop_service SIGTERM SIGINT
### 6. 启动对应模式 ###
if [ "$FASTDFS_MODE" = "all" ]; then
start_service "tracker"
start_service "storage"
/usr/local/nginx/sbin/nginx
tail -F "${LOG_DIR}/trackerd.log" "${LOG_DIR}/storaged.log"
else
[ "$FASTDFS_MODE" = "storage" ] && /usr/local/nginx/sbin/nginx
start_service "$FASTDFS_MODE"
tail -F "${LOG_DIR}/${FASTDFS_MODE}d.log"
fi
mod_fastdfs.conf
conf
connect_timeout=10
network_timeout=30
base_path=/tmp
load_fdfs_parameters_from_tracker=true
storage_sync_file_max_delay = 86400
use_storage_id = false
storage_ids_filename = storage_ids.conf
tracker_server=127.0.0.1:22122
storage_server_port=23000
group_name=group1
url_have_group_name = true
store_path_count=1
store_path0=/var/fdfs
log_level=info
log_filename=
response_mode=proxy
if_alias_prefix=
flv_support = true
flv_extension = flv
group_count = 0
# 这里注意mime.types是再nginx编译出来的,可以拷贝走,我懒
http.mime_types_filename=/usr/local/nginx/conf/mime.types
http.default_content_type=application/octet-stream
storage.conf
conf
disabled=false
group_name=group1
bind_addr=
client_bind=true
port=23000
connect_timeout=30
network_timeout=60
heart_beat_interval=30
stat_report_interval=60
base_path=/var/fdfs
max_connections=256
buff_size = 256KB
accept_threads=1
work_threads=4
disk_rw_separated = true
disk_reader_threads = 1
disk_writer_threads = 1
sync_wait_msec=50
sync_interval=0
sync_start_time=00:00
sync_end_time=23:59
write_mark_file_freq=500
store_path_count=1
store_path0=/var/fdfs
subdir_count_per_path=256
tracker_server=127.0.0.1:22122
log_level=info
run_by_group=
run_by_user=
allow_hosts=*
file_distribute_path_mode=0
file_distribute_rotate_count=100
fsync_after_written_bytes=0
sync_log_buff_interval=10
sync_binlog_buff_interval=10
sync_stat_file_interval=300
thread_stack_size=512KB
upload_priority=10
if_alias_prefix=
check_file_duplicate=0
file_signature_method=hash
key_namespace=FastDFS
keep_alive=0
use_access_log = false
rotate_access_log = false
access_log_rotate_time=00:00
rotate_error_log = false
error_log_rotate_time=00:00
rotate_access_log_size = 0
rotate_error_log_size = 0
log_file_keep_days = 0
file_sync_skip_invalid_record=false
use_connection_pool = false
connection_pool_max_idle_time = 3600
http.domain_name=
http.server_port=8888
tracker.conf
conf
disabled=false
bind_addr=
port=22122
connect_timeout=30
network_timeout=60
base_path=/var/fdfs
max_connections=256
accept_threads=1
work_threads=4
min_buff_size = 8KB
max_buff_size = 128KB
store_lookup=2
store_group=group2
store_server=0
store_path=0
download_server=0
reserved_storage_space = 10%
log_level=info
run_by_group=
run_by_user=
allow_hosts=*
sync_log_buff_interval = 10
check_active_interval = 120
thread_stack_size = 64KB
storage_ip_changed_auto_adjust = true
storage_sync_file_max_delay = 86400
storage_sync_file_max_time = 300
use_trunk_file = false
slot_min_size = 256
slot_max_size = 16MB
trunk_file_size = 64MB
trunk_create_file_advance = false
trunk_create_file_time_base = 02:00
trunk_create_file_interval = 86400
trunk_create_file_space_threshold = 20G
trunk_init_check_occupying = false
trunk_init_reload_from_binlog = false
trunk_compress_binlog_min_interval = 0
use_storage_id = false
storage_ids_filename = storage_ids.conf
id_type_in_filename = ip
store_slave_file_use_link = false
rotate_error_log = false
error_log_rotate_time=00:00
rotate_error_log_size = 0
log_file_keep_days = 0
use_connection_pool = false
connection_pool_max_idle_time = 3600
http.server_port=8080
http.check_alive_interval=30
http.check_alive_type=tcp
http.check_alive_uri=/status.html
client.conf
conf
connect_timeout = 5
network_timeout = 60
base_path = /var/fastdfs
tracker_server = 127.0.0.1:22122
log_level = info
connect_first_by = tracker
use_connection_pool = false
connection_pool_max_idle_time = 3600
load_fdfs_parameters_from_tracker = false
use_storage_id = false
storage_ids_filename = storage_ids.conf
http.tracker_server_port = 80
构建
一切准备就绪直接进行构建
bash
docker build -t fastdfs-nginx:6.11.0-20250722 .
docker+k8s启动
注:
先启动tracker,再启动storage,下边镜像自行替换,k8s我是挂载的目录,可以自行修改挂载到pv
docker-compose.yml
yml
version: '3.8'
services:
tracker:
image: fastdfs-nginx:6.11.0
container_name: fastdfs-tracker
environment:
FASTDFS_BASE_PATH: /var/fdfs
ports:
- "22122:22122"
volumes:
- /data/tracker:/var/fdfs
restart: always
command: ["/entrypoint.sh", "tracker"]
storage:
image: fastdfs-nginx:6.11.0
container_name: fastdfs-storage
environment:
TRACKER_SERVER: tracker:22122 # 使用服务名,自动DNS解析
PORT: 23000
ports:
- "23000:23000"
- "8888:8888"
volumes:
- /data/storage:/var/fdfs
depends_on:
- tracker
restart: always
command: ["/entrypoint.sh", "storage"]
k8s-tracker.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: fastdfs-tracker
namespace: test
spec:
replicas: 1
selector:
matchLabels:
app: fastdfs-tracker
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: fastdfs-tracker
spec:
containers:
- command:
- /bin/bash
- /entrypoint.sh
- tracker
env:
- name: FASTDFS_BASE_PATH
value: /var/fdfs
- name: PORT
value: "22122"
- name: TRACKER_SERVER
value: fastdfs-tracker:22122
image: fastdfs-nginx:6.11.0
imagePullPolicy: IfNotPresent
name: tracker
ports:
- containerPort: 22122
hostPort: 22122
protocol: TCP
volumeMounts:
- mountPath: /var/fdfs
name: tracker-volume
#hostNetwork: true
volumes:
- hostPath:
path: /data/fastdfs/tracker
type: ""
name: tracker-volume
---
apiVersion: v1
kind: Service
metadata:
name: fastdfs-tracker
namespace: test
spec:
ipFamilyPolicy: SingleStack
ports:
- name: fastdfs-tracker
port: 22122
protocol: TCP
targetPort: 22122
selector:
app: fastdfs-tracker
sessionAffinity: None
type: NodePort
k8s-storage.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: fastdfs-storage
namespace: test
spec:
replicas: 1
selector:
matchLabels:
app: fastdfs-storage
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: fastdfs-storage
spec:
containers:
- command:
- /bin/bash
- /entrypoint.sh
- storage
env:
- name: TRACKER_SERVER
value: fastdfs-tracker:22122
- name: PORT
value: "23000"
image: fastdfs-nginx:6.11.0
imagePullPolicy: IfNotPresent
name: storage
ports:
- containerPort: 23000
hostPort: 23000
protocol: TCP
- containerPort: 8888
hostPort: 8888
protocol: TCP
volumeMounts:
- mountPath: /var/fdfs
name: storage-volume
#hostNetwork: true
volumes:
- hostPath:
path: /data/fastdfs/storage
type: ""
name: storage-volume
---
apiVersion: v1
kind: Service
metadata:
name: fastdfs-storage
namespace: test
spec:
ipFamilyPolicy: SingleStack
ports:
- name: fastdfs-storage
port: 23000
protocol: TCP
targetPort: 23000
- name: fastdfs-storage-http
port: 8888
protocol: TCP
targetPort: 8888
selector:
app: fastdfs-storage
sessionAffinity: None
type: NodePort
测试
自带fdfs_test命令
bash
fdfs_test /etc/fdfs/client.conf upload ./aaa.jpeg

python脚本测试
这里博主放置两个脚本,分别是测试fastdfs5.X 和fastdfs 6.X的,两个是不一样,图片自行配置
-
client.conf
conf# 这个不分版本,记得修改地址 connect_timeout=30 network_timeout=60 base_path=/tmp tracker_server=192.168.1.2:22122 log_level=info
-
python
# fastdfs 5.X from fdfs_client.client import Fdfs_client, get_tracker_conf def test_fastdfs_upload(): # 加载配置文件路径 conf_path = './client.conf' # 请根据实际路径调整 client = Fdfs_client(conf_path) # 上传文件(根据实际文件名改) filename = './aaa.jpeg' try: result = client.upload_by_filename(filename) print("上传结果:", result) except Exception as e: print("上传出错:", e) if __name__ == '__main__': test_fastdfs_upload()
-
bash
pip install fastdfs-client
python# fastdfs 6.X from fastdfs_client import FastdfsClient client = FastdfsClient('./client.conf') print('1') res = client.upload_by_filename('./aaa.jpeg') print('2') print("上传结果:", res)
执行结果参考
bash
[root@sonar test]# python3 f5.py
上传结果: {'Group name': 'group1', 'Remote file_id': 'group1/M00/0A/0F/Cv9lHmh_V8qAWtmJAACatpnOrTc65.jpeg', 'Status': 'Upload successed.', 'Local file name': './aaa.jpeg', 'Uploaded size': '38.68KB', 'Storage IP': '192.168.1.3'}
[root@sonar test]# python3 f6.py
1
2
上传结果: {'Group name': 'group1', 'Remote file_id': 'group1/M00/0A/0F/Cv9lHmh_V86AfIy3AACatpnOrTc23.jpeg', 'Status': 'Upload successed.', 'Local file name': './aaa.jpeg', 'Uploaded size': '38.68KB', 'Storage IP': '192.168.1.2'}
[root@sonar test]#
常见问题
-
访问 404
检查
mod_fastdfs.conf
中store_path0
是否与storage.conf
保持一致。 -
Nginx 启动无 Worker
检查
/var/log/nginx/error.log
,确认mod_fastdfs.conf
配置正确。 -
Tracker 显示磁盘空间为 0
确保
store_path0
目录存在且权限正确。 -
存储剩余10%时候fastdfs上传失败
检查
tracker.conf
中的reserved_storage_space
值,默认是10%可以自行更改 -
k8s重启问题
注意存储下边的
storage/data/fdfs_storaged.pid
是否被清理tracker/data/fdfs_trackerd.pid
总结与建议
- 单机环境 适合功能验证,生产环境建议 多 Tracker + 多 Storage 集群。
- 定期清理日志 ,避免
base_path
空间被占满。