文章目录
- [CentOS7 部署 FastDFS + Nginx 文件服务器(完整实践)](#CentOS7 部署 FastDFS + Nginx 文件服务器(完整实践))
- [一、FastDFS 简介](#一、FastDFS 简介)
- 二、实验环境
- 三、软件版本
- 四、安装包下载
- 五、环境准备
- [六、安装 libfastcommon](#六、安装 libfastcommon)
- [七、安装 FastDFS](#七、安装 FastDFS)
- [八、配置 FastDFS](#八、配置 FastDFS)
- [九、配置 Tracker](#九、配置 Tracker)
- [十、配置 Storage](#十、配置 Storage)
- [十一、配置 Client](#十一、配置 Client)
- [十二、启动 FastDFS](#十二、启动 FastDFS)
- 十三、配置开机启动
- [十四、部署 Nginx](#十四、部署 Nginx)
- [十五、编译 Nginx + FastDFS 模块](#十五、编译 Nginx + FastDFS 模块)
- [十六、配置 fastdfs-nginx-module](#十六、配置 fastdfs-nginx-module)
- [十七、配置 Nginx](#十七、配置 Nginx)
- [十八、启动 Nginx](#十八、启动 Nginx)
- [十九、使用 Supervisor 管理 Nginx](#十九、使用 Supervisor 管理 Nginx)
- 二十、测试文件上传
- [二十一、查看 FastDFS 状态](#二十一、查看 FastDFS 状态)
- 总结
- 致此完毕,下边是补充
- [二十二、FastDFS 目录结构解析](#二十二、FastDFS 目录结构解析)
-
- [为什么有 256 × 256 个目录?](#为什么有 256 × 256 个目录?)
- [二十三、FastDFS 文件上传流程](#二十三、FastDFS 文件上传流程)
-
- [① Client 请求 Tracker](#① Client 请求 Tracker)
- [② Client 上传文件到 Storage](#② Client 上传文件到 Storage)
- [③ Client 保存文件地址](#③ Client 保存文件地址)
- 二十四、生产环境最佳实践
-
- [1 Tracker 高可用](#1 Tracker 高可用)
- [2 Storage 多节点](#2 Storage 多节点)
- [3 存储磁盘独立](#3 存储磁盘独立)
- [4 Nginx 负载均衡](#4 Nginx 负载均衡)
- [5 日志和监控](#5 日志和监控)
- [二十五、FastDFS 常见坑(90%的人会踩)](#二十五、FastDFS 常见坑(90%的人会踩))
-
- [1 Nginx 无法访问文件](#1 Nginx 无法访问文件)
- [2 storage.conf 与 mod_fastdfs.conf 不一致](#2 storage.conf 与 mod_fastdfs.conf 不一致)
- [3 tracker 地址错误](#3 tracker 地址错误)
- [4 SELinux 或防火墙问题](#4 SELinux 或防火墙问题)
- [5 文件描述符不足](#5 文件描述符不足)
- [6 Nginx 编译模块错误](#6 Nginx 编译模块错误)
- [7 Storage 没有注册到 Tracker](#7 Storage 没有注册到 Tracker)
- 结语
CentOS7 部署 FastDFS + Nginx 文件服务器(完整实践)
一、FastDFS 简介
FastDFS 是一个开源的 分布式文件系统,主要用于解决大规模文件存储问题,例如:
- 图片存储
- 视频存储
- 文档存储
- 对象存储
FastDFS 具有以下特点:
- 高性能
- 支持海量文件存储
- 支持负载均衡
- 支持横向扩展
- 部署简单
FastDFS 主要由三个角色组成:
| 组件 | 作用 |
|---|---|
| Tracker | 调度服务器,负责管理 Storage |
| Storage | 实际存储文件 |
| Client | 上传和下载文件 |
系统架构示意:
bash
Client
│
▼
Tracker Server
│
▼
Storage Server
│
▼
File Storage
通常情况下我们会通过 Nginx + FastDFS 模块 来提供 HTTP 访问能力。
二、实验环境
| 项目 | 信息 |
|---|---|
| 操作系统 | CentOS 7.9 |
| CPU | 4 Core |
| 内存 | 8G |
| 磁盘 | 100G |
| IP | 192.168.1.1 |
三、软件版本
| 软件 | 版本 |
|---|---|
| FastDFS | 5.11 |
| libfastcommon | 1.0.39 |
| fastdfs-nginx-module | 1.20 |
| nginx | 1.14.2 |
四、安装包下载
bash
mkdir -p /data/bag/fastdfs/
cd /data/bag/fastdfs/
bash
wget https://github.com/happyfish100/fastdfs/archive/refs/tags/V5.11.tar.gz
wget https://github.com/happyfish100/libfastcommon/archive/refs/tags/V1.0.39.tar.gz
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/refs/tags/V1.20.tar.gz
wget http://nginx.org/download/nginx-1.14.2.tar.gz
五、环境准备
安装依赖:
bash
yum -y install gcc gcc-c++ libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel libevent libevent-devel perl unzip net-tools
六、安装 libfastcommon
libfastcommon 是 FastDFS 的基础依赖库。
bash
tar xf V1.0.39.tar.gz
cd libfastcommon-1.0.39
./make.sh
./make.sh install
七、安装 FastDFS
bash
tar xf V5.11.tar.gz
cd fastdfs-5.11
./make.sh
./make.sh install
检查是否安装成功:
bash
ls /usr/bin | grep fdfs
正常情况下会看到类似命令:
bash
fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_storaged
fdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file
八、配置 FastDFS
进入配置目录:
bash
cd /etc/fdfs
备份示例配置:
bash
mkdir bak
mv *sample bak/
修改系统文件描述符限制:
bash
ulimit -n 25600
创建 FastDFS 数据目录:
bash
mkdir -p /data/app/fastdfs
需要修改三个配置文件:
client.conf
storage.conf
tracker.conf
九、配置 Tracker
编辑:
bash
vim /etc/fdfs/tracker.conf
完整配置:
ini
disabled=false
bind_addr=
port=22122
connect_timeout=30
network_timeout=60
## 路径
base_path=/data/app/fastdfs
max_connections=25600
accept_threads=1
work_threads=20
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
说明:
- base_path:日志和数据存储目录
- port:tracker 服务端口
十、配置 Storage
编辑:
bash
vim /etc/fdfs/storage.conf
完整配置:
ini
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=/data/app/fastdfs
max_connections=25600
buff_size = 256KB
accept_threads=2
work_threads=20
disk_rw_separated = true
disk_reader_threads = 5
disk_writer_threads = 5
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=/data/app/fastdfs
subdir_count_per_path=256
## 地址
tracker_server=192.168.1.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 = true
connection_pool_max_idle_time = 3600
http.domain_name=
http.server_port=8888
说明:
| 参数 | 说明 |
|---|---|
| group_name | 存储组名称 |
| store_path0 | 文件存储路径 |
| tracker_server | tracker 地址 |
十一、配置 Client
编辑:
bash
vim /etc/fdfs/client.conf
配置:
ini
connect_timeout=30
network_timeout=60
## 路径
base_path=/data/app/fastdfs
## 地址
tracker_server=192.168.1.1:22122
log_level=info
use_connection_pool = true
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
十二、启动 FastDFS
启动 Tracker:
bash
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
启动 Storage:
bash
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
检查服务:
bash
ps -ef | grep fdfs
netstat -nltp |grep fdfs

十三、配置开机启动
编辑:
/etc/rc.local
添加:
bash
#!/bin/bash
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
赋予执行权限:
bash
chmod +x /etc/rc.d/rc.local
十四、部署 Nginx
解压源码:
bash
cd /data/bag/fastdfs
tar xf V1.20.tar.gz
tar xf nginx-1.14.2.tar.gz
十五、编译 Nginx + FastDFS 模块
编辑fastdfs-nginx-module-1.20的config,只改这两行,其他不变
config
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
···
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
进入 nginx 目录:
bash
cd nginx-1.14.2
编译:
bash
./configure --prefix=/data/app/nginx --add-module=/data/bag/fastdfs/fastdfs-nginx-module-1.20/src
安装:
bash
make
make install
十六、配置 fastdfs-nginx-module
复制配置:
bash
cp fastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs/
编辑:
bash
vim /etc/fdfs/mod_fastdfs.conf
配置:
ini
#include http.conf
connect_timeout=2
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=192.168.1.1:22122
storage_server_port=23000
group_name=group1
url_have_group_name = true
store_path_count=1
# 路径
store_path0=/data/app/fastdfs
log_level=info
log_filename=
response_mode=proxy
if_alias_prefix=
flv_support = true
flv_extension = flv
group_count = 0
复制 HTTP 配置文件:
bash
cp fastdfs-5.11/conf/http.conf /etc/fdfs/
cp fastdfs-5.11/conf/mime.types /etc/fdfs/
十七、配置 Nginx
编辑:
bash
vim /data/app/nginx/conf/nginx.conf
配置:
nginx
user root;
worker_processes 1;
error_log logs/error.log debug;
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"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 8888;
access_log logs/host.access.log main;
location ~/group([0-9])/M00 {
alias /data/app/fastdfs/data;
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
十八、启动 Nginx
检测配置:
bash
/data/app/nginx/sbin/nginx -t
启动:
bash
/data/app/nginx/sbin/nginx
查看端口:
bash
netstat -nltp | grep 8888
十九、使用 Supervisor 管理 Nginx
安装:
bash
yum install -y epel-release
yum install -y supervisor
启动:
bash
systemctl enable supervisord --now
配置:
/etc/supervisord.d/nginx.ini
ini
[program:nginx]
command=/data/app/nginx/sbin/nginx -g 'daemon off;'
directory=/data/app/nginx
autostart=true
autorestart=true
# 为true,则stderr/stdout的日志会被写入stdout/stdout日志文件中
redirect_stderr=true
redirect_stdout=true
priority=10
stdout_logfile=/data/app/nginx/nginx.log
stderr_logfile=/data/app/nginx/nginx.log
# 最大日志文件大小为 10MB
stdout_logfile_maxbytes=10MB
# 保留 5 个备份文件
stdout_logfile_backups=5
# 最大错误日志文件大小为 10MB
stderr_logfile_maxbytes=10MB
# 保留 5 个备份错误日志文件
stderr_logfile_backups=5
加载配置:
bash
supervisorctl update
二十、测试文件上传
bash
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf aaa.jpeg
返回结果:


二十一、查看 FastDFS 状态
bash
fdfs_monitor /etc/fdfs/client.conf
查看版本:
bash
fdfs_monitor /etc/fdfs/client.conf | grep version
总结
至此,一个完整的 FastDFS + Nginx 文件服务器 就部署完成了。
整体架构如下:
Client
│
▼
Nginx
│
▼
FastDFS Storage
│
▼
文件存储
优点:
- 高性能
- 支持海量文件
- 可横向扩展
- 适合图片/视频存储
致此完毕,下边是补充
二十二、FastDFS 目录结构解析
在上传文件之后,我们会发现 Storage 的存储目录结构比较复杂,例如:
bash
/data/app/fastdfs/data/00/00/CgABk2Yxxx.jpg
完整结构一般类似:
/data/app/fastdfs
├── data
│ ├── 00
│ │ ├── 00
│ │ │ ├── CgABk2Yxxx.jpg
│ │ │ ├── CgABk2Yxxx.meta
│ │ │ └── ...
│ ├── 00
│ ├── 01
│ └── ...
├── logs
└── storage_stat.dat
目录说明:
| 目录 | 作用 |
|---|---|
| base_path | FastDFS 的运行目录 |
| data | 实际存储文件目录 |
| logs | 日志目录 |
| storage_stat.dat | Storage 状态信息 |
| sync | 集群同步信息 |
为什么有 256 × 256 个目录?
FastDFS 默认会创建:
256 × 256 = 65536
个子目录。
例如:
data/00/00
data/00/01
data/01/00
data/01/01
这样设计的原因:
避免单目录文件过多
Linux 单目录文件过多会导致:
- inode 查找慢
- ext4 性能下降
因此 FastDFS 使用 两级 hash 目录 来分散文件。
二十三、FastDFS 文件上传流程
FastDFS 的上传流程如下:
Client
│
│ 1. 上传请求
▼
Tracker Server
│
│ 2. 返回可用 Storage
▼
Storage Server
│
│ 3. 写入磁盘
▼
File Storage
详细步骤:
① Client 请求 Tracker
客户端首先向 Tracker 请求:
我要上传文件
Tracker 会返回:
可用的 Storage 节点
例如:
192.168.1.1:23000
② Client 上传文件到 Storage
客户端直接连接 Storage:
upload file
Storage 会:
- 生成文件名
- 写入磁盘
- 返回文件 ID
例如:
group1/M00/00/00/CgABk2Yxxx.jpg
③ Client 保存文件地址
应用程序保存返回路径:
group1/M00/00/00/CgABk2Yxxx.jpg
访问时通过:
http://nginx/group1/M00/00/00/CgABk2Yxxx.jpg
二十四、生产环境最佳实践
在生产环境部署 FastDFS 时,建议遵循以下架构。
1 Tracker 高可用
Tracker 至少部署 2 台:
Tracker1
Tracker2
客户端配置:
ini
tracker_server=192.168.1.10:22122
tracker_server=192.168.1.11:22122
Tracker 本身是 无状态的。
因此:
- 不需要同步
- 可以直接扩展
2 Storage 多节点
建议:
Storage1
Storage2
Storage3
同一个 group:
group1
好处:
- 文件自动同步
- 提高容灾能力
3 存储磁盘独立
建议:
系统盘
/data
示例:
/dev/sda 系统盘
/dev/sdb FastDFS 存储盘
Storage 配置:
store_path0=/data/fastdfs
这样可以避免:
- 系统盘被写满
- I/O 争抢
4 Nginx 负载均衡
架构:
Nginx
/ \
Storage1 Storage2
Nginx upstream:
nginx
upstream fastdfs {
server 192.168.1.21:8888;
server 192.168.1.22:8888;
}
5 日志和监控
建议监控:
- Tracker 进程
- Storage 进程
- 磁盘容量
- 文件同步状态
可以结合:
- Zabbix
- Prometheus
二十五、FastDFS 常见坑(90%的人会踩)
这里总结几个 部署时最常见的问题。
1 Nginx 无法访问文件
现象:
404 Not Found
原因:
mod_fastdfs.conf 配置错误。
重点检查:
store_path0
group_name
url_have_group_name
例如:
ini
store_path0=/data/app/fastdfs
group_name=group1
url_have_group_name=true
2 storage.conf 与 mod_fastdfs.conf 不一致
这是最常见的问题。
例如:
storage.conf
store_path0=/data/app/fastdfs
mod_fastdfs.conf
store_path0=/data/fastdfs
会导致:
Nginx 无法找到文件
3 tracker 地址错误
如果 tracker 配错:
tracker_server=192.168.1.2
会导致:
upload file failed
检查:
telnet tracker_ip 22122
4 SELinux 或防火墙问题
很多人会遇到:
Nginx访问失败
建议关闭:
setenforce 0
或关闭防火墙:
systemctl stop firewalld
5 文件描述符不足
FastDFS 高并发时容易报错:
too many open files
解决:
ulimit -n 25600
或者修改:
/etc/security/limits.conf
6 Nginx 编译模块错误
错误类似:
ngx_http_fastdfs_module.c: No such file
原因:
模块路径错误。
正确示例:
--add-module=/data/bag/fastdfs/fastdfs-nginx-module-1.20/src
7 Storage 没有注册到 Tracker
查看状态:
fdfs_monitor /etc/fdfs/client.conf
如果看到:
storage server count: 0
说明 Storage 没注册成功。
原因通常是:
tracker_server 配错
结语
FastDFS 是一个非常经典的 分布式文件存储系统,虽然现在很多公司开始使用:
- MinIO
- Ceph
- OSS
但 FastDFS 在很多企业内部仍然被广泛使用。
如果是:
- 图片服务器
- 文件服务器
- 内部对象存储
FastDFS 依然是一个 稳定可靠的方案。