CentOS7 部署 FastDFS 5.11 + Nginx 1.14 文件服务器(完整实践)

文章目录

  • [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 目录结构解析)
  • [二十三、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 会:

  1. 生成文件名
  2. 写入磁盘
  3. 返回文件 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 依然是一个 稳定可靠的方案


相关推荐
济南java开发,求内推3 个月前
docker 安装fastdfs
docker·fastdfs
武子康3 个月前
Java-181 OSS 实战指南:Bucket/外链/防盗链/计费与常见坑
java·大数据·分布式·oss·云存储·fastdfs·ali
武子康3 个月前
Java-182 OSS 权限控制实战:ACL / RAM / Bucket Policy 与错误排查
java·数据库·阿里云·云计算·oss·fastdfs·fdfs
武子康3 个月前
Java-179 FastDFS 高并发优化思路:max_connections、线程、目录与同步
java·开发语言·nginx·性能优化·系统架构·fastdfs·fdfs
武子康4 个月前
Java-174 FastFDS 从单机到分布式文件存储:实战与架构取舍
java·大数据·分布式·性能优化·系统架构·dfs·fastdfs
橙-极纪元4 个月前
文件存储服务有哪些?他们优缺点分别是什么?FastDFS、MinIO、Ceph、HDFS、MooseFS、TFS、七牛云、阿里云 OSS
hdfs·minio·七牛云·tfs·fastdfs·阿里云 oss·文件存储服务
yunmi_5 个月前
分布式文件存储系统FastDFS(入门)
java·分布式·maven·fastdfs
core5127 个月前
fastdfs快速部署、集成、调优
docker·部署·springboot·fastdfs·调用
XMYX-08 个月前
FastDFS 6.11.0 单机环境搭建与测试(附 Nginx 集成)+ docker构建+k8s启动文件
nginx·docker·kubernetes·fastdfs