文章目录
- CentOS7 部署 FastDFS + Nginx 文件服务器(完整实践)
- 一、FastDFS 简介
- 二、实验环境
- 三、软件版本
- 四、安装包下载
- 五、环境准备
- 六、安装 libfastcommon
- 七、安装 FastDFS
- 八、配置 FastDFS
- 九、配置 Tracker
- 十、配置 Storage
- 十一、配置 Client
- 十二、启动 FastDFS
- 十三、配置开机启动
- 十四、部署 Nginx
- 十五、编译 Nginx + FastDFS 模块
- 十六、配置 fastdfs-nginx-module
- 十七、配置 Nginx
- 十八、启动 Nginx
- 十九、使用 Supervisor 管理 Nginx
- 二十、测试文件上传
- 二十一、查看 FastDFS 状态
- 总结
- 致此完毕,下边是补充
- 二十二、FastDFS 目录结构解析
- 为什么有 256 × 256 个目录?
- 避免单目录文件过多
- 二十三、FastDFS 文件上传流程
- ① Client 请求 Tracker
- ② Client 上传文件到 Storage
- ③ Client 保存文件地址
- 二十四、生产环境最佳实践
- 1 Tracker 高可用
- 2 Storage 多节点
- 3 存储磁盘独立
- 4 Nginx 负载均衡
- 5 日志和监控
- 二十五、FastDFS 常见坑(90%的人会踩)
- 1 Nginx 无法访问文件
- 2 storage.conf 与 mod_fastdfs.conf 不一致
- 3 tracker 地址错误
- 4 SELinux 或防火墙问题
- 5 文件描述符不足
- 6 Nginx 编译模块错误
- 7 Storage 没有注册到 Tracker
- 结语
CentOS7 部署 FastDFS + Nginx 文件服务器(完整实践)
一、FastDFS 简介
FastDFS是一个开源的分布式文件系统,主要用于解决大规模文件存储问题,例如:
- 图片存储
- 视频存储
- 文档存储
- 对象存储
FastDFS 具有以下特点:
- 高性能
- 支持海量文件存储
- 支持负载均衡
- 支持横向扩展
- 部署简单
FastDFS 主要由三个角色组成:
| 组件 | 作用 |
|---|---|
| Tracker | 调度服务器,负责管理 Storage |
| Storage | 实际存储文件 |
| Client | 上传和下载文件 |
系统架构示意:
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 |
四、安装包下载
mkdir-p/data/bag/fastdfs/cd/data/bag/fastdfs/wgethttps://github.com/happyfish100/fastdfs/archive/refs/tags/V5.11.tar.gzwgethttps://github.com/happyfish100/libfastcommon/archive/refs/tags/V1.0.39.tar.gzwgethttps://github.com/happyfish100/fastdfs-nginx-module/archive/refs/tags/V1.20.tar.gzwgethttp://nginx.org/download/nginx-1.14.2.tar.gz五、环境准备
安装依赖:
yum-yinstallgcc gcc-c++ libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel libevent libevent-devel perlunzipnet-tools六、安装 libfastcommon
libfastcommon 是 FastDFS 的基础依赖库。
tarxf V1.0.39.tar.gzcdlibfastcommon-1.0.39 ./make.sh ./make.shinstall七、安装 FastDFS
tarxf V5.11.tar.gzcdfastdfs-5.11 ./make.sh ./make.shinstall检查是否安装成功:
ls/usr/bin|grepfdfs正常情况下会看到类似命令:
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
进入配置目录:
cd/etc/fdfs备份示例配置:
mkdirbakmv*sample bak/修改系统文件描述符限制:
ulimit-n25600创建 FastDFS 数据目录:
mkdir-p/data/app/fastdfs需要修改三个配置文件:
client.conf storage.conf tracker.conf九、配置 Tracker
编辑:
vim/etc/fdfs/tracker.conf完整配置:
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
编辑:
vim/etc/fdfs/storage.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=/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
编辑:
vim/etc/fdfs/client.conf配置:
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:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf启动 Storage:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf检查服务:
ps-ef|grepfdfsnetstat-nltp|grepfdfs十三、配置开机启动
编辑:
/etc/rc.local添加:
#!/bin/bash/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf /usr/bin/fdfs_storaged /etc/fdfs/storage.conf赋予执行权限:
chmod+x /etc/rc.d/rc.local十四、部署 Nginx
解压源码:
cd/data/bag/fastdfstarxf V1.20.tar.gztarxf nginx-1.14.2.tar.gz十五、编译 Nginx + FastDFS 模块
编辑fastdfs-nginx-module-1.20的config,只改这两行,其他不变
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/" ··· CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"进入 nginx 目录:
cdnginx-1.14.2编译:
./configure--prefix=/data/app/nginx --add-module=/data/bag/fastdfs/fastdfs-nginx-module-1.20/src安装:
makemakeinstall十六、配置 fastdfs-nginx-module
复制配置:
cpfastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs/编辑:
vim/etc/fdfs/mod_fastdfs.conf配置:
#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 配置文件:
cpfastdfs-5.11/conf/http.conf /etc/fdfs/cpfastdfs-5.11/conf/mime.types /etc/fdfs/十七、配置 Nginx
编辑:
vim/data/app/nginx/conf/nginx.conf配置:
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
检测配置:
/data/app/nginx/sbin/nginx-t启动:
/data/app/nginx/sbin/nginx查看端口:
netstat-nltp|grep8888十九、使用 Supervisor 管理 Nginx
安装:
yuminstall-yepel-release yuminstall-ysupervisor启动:
systemctlenablesupervisord--now配置:
/etc/supervisord.d/nginx.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加载配置:
supervisorctl update二十、测试文件上传
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf aaa.jpeg返回结果:
二十一、查看 FastDFS 状态
fdfs_monitor /etc/fdfs/client.conf查看版本:
fdfs_monitor /etc/fdfs/client.conf|grepversion总结
至此,一个完整的FastDFS + Nginx 文件服务器就部署完成了。
整体架构如下:
Client │ ▼ Nginx │ ▼ FastDFS Storage │ ▼ 文件存储优点:
- 高性能
- 支持海量文件
- 可横向扩展
- 适合图片/视频存储
致此完毕,下边是补充
二十二、FastDFS 目录结构解析
在上传文件之后,我们会发现 Storage 的存储目录结构比较复杂,例如:
/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 fileStorage 会:
- 生成文件名
- 写入磁盘
- 返回文件 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客户端配置:
tracker_server=192.168.1.10:22122 tracker_server=192.168.1.11:22122Tracker 本身是无状态的。
因此:
- 不需要同步
- 可以直接扩展
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 Storage2Nginx upstream:
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例如:
store_path0=/data/app/fastdfs group_name=group1 url_have_group_name=true2 storage.conf 与 mod_fastdfs.conf 不一致
这是最常见的问题。
例如:
storage.conf
store_path0=/data/app/fastdfsmod_fastdfs.conf
store_path0=/data/fastdfs会导致:
Nginx 无法找到文件3 tracker 地址错误
如果 tracker 配错:
tracker_server=192.168.1.2会导致:
upload file failed检查:
telnet tracker_ip 221224 SELinux 或防火墙问题
很多人会遇到:
Nginx访问失败建议关闭:
setenforce 0或关闭防火墙:
systemctl stop firewalld5 文件描述符不足
FastDFS 高并发时容易报错:
too many open files解决:
ulimit -n 25600或者修改:
/etc/security/limits.conf6 Nginx 编译模块错误
错误类似:
ngx_http_fastdfs_module.c: No such file原因:
模块路径错误。
正确示例:
--add-module=/data/bag/fastdfs/fastdfs-nginx-module-1.20/src7 Storage 没有注册到 Tracker
查看状态:
fdfs_monitor /etc/fdfs/client.conf如果看到:
storage server count: 0说明 Storage 没注册成功。
原因通常是:
tracker_server 配错结语
FastDFS 是一个非常经典的分布式文件存储系统,虽然现在很多公司开始使用:
- MinIO
- Ceph
- OSS
但 FastDFS 在很多企业内部仍然被广泛使用。
如果是:
- 图片服务器
- 文件服务器
- 内部对象存储
FastDFS 依然是一个稳定可靠的方案。