CentOS 7 环境下 FastDFS 与 Nginx 分布式文件系统集群部署指南
一、 系统环境初始化与依赖安装
在构建分布式文件系统之前,需要确保操作系统的编译环境和基础依赖库已就绪。这里我们切换至国内镜像源以提升下载速度,并安装必要的开发工具包。
# 备份并替换为网易镜像源(可选)
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
yum clean all && yum makecache
# 安装编译工具及FastDFS运行所需的依赖库
yum install -y gcc gcc-c++ make automake autoconf libtool
yum install -y zlib zlib-devel pcre pcre-devel openssl openssl-devel
yum install -y libevent libevent-devel perl unzip net-tools wget
二、 部署基础公共库 libfastcommon
FastDFS 依赖于 libfastcommon 提供的基础 C 语言函数库。我们需要从源码进行编译安装。
# 解压并进入 libfastcommon 源码目录
tar -zxvf libfastcommon-1.0.43.tar.gz
cd libfastcommon-1.0.43
# 执行编译与安装脚本
./make.sh
./make.sh install
安装完成后,动态链接库默认会被放置于 /usr/lib64 目录下。由于 FastDFS 主程序在运行时默认寻找 /usr/lib 路径,因此需要建立符号链接以防止找不到库文件的错误。
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
三、 安装与配置 FastDFS 核心组件
3.1 编译安装 FastDFS
# 解压 FastDFS 源码包
tar -zxvf fastdfs-6.06.tar.gz
cd fastdfs-6.06
# 编译并安装
./make.sh
./make.sh install
安装成功后,相关的配置文件模板会被自动复制到 /etc/fdfs/ 目录下。为了方便使用,我们将模板重命名并统一规划数据存储路径。
# 创建统一的数据与日志存储根目录
mkdir -p /data/fastdfs/{tracker,storage,client}
# 复制并重命名配置文件
cd /etc/fdfs/
cp tracker.conf.sample tracker.conf
cp storage.conf.sample storage.conf
cp client.conf.sample client.conf
3.2 配置并启动 Tracker(追踪器)
Tracker 主要负责调度和负载均衡。编辑 tracker.conf,修改基础路径:
vim /etc/fdfs/tracker.conf
找到 base_path 参数并修改为:
base_path=/data/fastdfs/tracker
启动 Tracker 服务并验证进程状态:
# 启动服务
fdfs_trackerd /etc/fdfs/tracker.conf
# 检查进程是否正常运行
ps aux | grep fdfs_trackerd
3.3 配置并启动 Storage(存储器)
Storage 负责实际的文件存储。编辑 storage.conf,调整以下核心参数:
vim /etc/fdfs/storage.conf
base_path=/data/fastdfs/storage
store_path0=/data/fastdfs/storage
# 假设 Tracker 节点的 IP 为 10.0.0.50,默认端口为 22122
tracker_server=10.0.0.50:22122
启动 Storage 服务并确认进程:
fdfs_storaged /etc/fdfs/storage.conf
ps aux | grep fdfs_storaged
3.4 客户端上传测试
在验证 Nginx 集成前,先通过自带的客户端工具测试文件上传功能。修改 client.conf:
base_path=/data/fastdfs/client
tracker_server=10.0.0.50:22122
执行上传命令:
fdfs_upload_file /etc/fdfs/client.conf /tmp/test_image.png
# 成功输出示例:group1/M00/00/00/wKgBOl3r2XuAHmqvAAE2TibrR2c044.png
四、 Nginx 与 FastDFS 模块集成
为了实现通过 HTTP 协议直接访问 FastDFS 中的文件,需要编译 Nginx 并加载 fastdfs-nginx-module 模块。
4.1 调整模块配置与依赖链接
进入 fastdfs-nginx-module 的源码目录,修改 config 文件以修正包含路径和库路径:
cd /usr/local/src/fastdfs-nginx-module/src
vim config
将原有的路径配置修改为实际安装路径:
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"
同样,为客户端库建立软链接:
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
将模块的配置文件复制到 FastDFS 配置目录:
cp mod_fastdfs.conf /etc/fdfs/
4.2 配置 mod_fastdfs.conf
编辑 /etc/fdfs/mod_fastdfs.conf,使其与 Tracker 和 Storage 的配置保持一致:
base_path=/data/fastdfs/storage
tracker_server=10.0.0.50:22122
url_have_group_name = true
store_path0=/data/fastdfs/storage
4.3 编译安装 Nginx
创建 Nginx 运行所需的临时目录,并开始配置编译参数:
mkdir -p /var/tmp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
cd /usr/local/src/nginx-1.20.1
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--add-module=/usr/local/src/fastdfs-nginx-module/src
make && make install
4.4 配置 Nginx 路由规则
编辑 Nginx 主配置文件 /usr/local/nginx/conf/nginx.conf,添加针对 FastDFS 文件路径的拦截规则:
server {
listen 80;
server_name 10.0.0.50;
# 拦截包含 group 名称的请求路径,交由 fastdfs 模块处理
location ~ /group[1-9]/M0[0-9] {
ngx_fastdfs_module;
}
}
启动 Nginx 服务:
/usr/local/nginx/sbin/nginx
五、 最终联调与故障排查
使用测试工具生成带有完整 URL 的上传报告:
fdfs_test /etc/fdfs/client.conf upload /tmp/test_image.png
在输出的日志中,找到 example file url 对应的 HTTP 链接,在浏览器中访问。如果文件能够正常显示,说明整个集群部署成功。
若上传成功但浏览器访问返回 404 或 502 错误,请重点排查以下环节:
- 确认
/etc/fdfs/mime.types文件是否存在,Nginx 模块依赖该文件识别文件类型。 - 检查
mod_fastdfs.conf中的tracker_serverIP 和端口是否与 Tracker 实际监听一致。 - 查看 Nginx 的
error.log,确认是否存在权限不足或模块加载失败的报错信息。