fastDFS安装文档
一 安装环境
1 服务器环境
服务器 | 系统 | 角色 | 组 |
---|---|---|---|
172.16.1.5 | centos6.9 | tracker、storage、nginx | group1 |
172.16.1.6 | centos6.9 | tracker、storage、nginx | group1 |
2 软件版本
软件包 | 版本号 |
---|---|
fastDFS | V5.11 |
libfastcommon | V1.0.36 |
fastdfs-nginx-module | V1.1.6 |
nginx | V1.10.2 |
二 安装libfastcommon
所有的软件下载到/opt/tools/fastdfs目录下
libfastcommon是从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库,基础环境,安装即可 。
1 下载libfastcommon
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.36.tar.gz
2 解压、编译、安装
tar xf V1.0.36.tar.gz
cd libfastcommon-1.0.36
./make.sh
./make.sh install
3 创建连接
libfastcommon.so 安装到了/usr/lib64/libfastcommon.so,但是FastDFS主程序设置的lib目录是/usr/local/lib,所以需要创建软链接。
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
三 安装fastDFS
1 下载fastDFS
wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
2 解压、编译、安装
tar xf V5.11.tar.gz
cd fastdfs-5.11
./make.sh
./make.sh install
3 默认安装方式安装后的相应文件与目录
启动脚本
/etc/init.d/fdfs_storaged
/etc/init.d/fdfs_trackerd
配置文件
/etc/fdfs/client.conf.sample
/etc/fdfs/storage.conf.sample
/etc/fdfs/storage_ids.conf.sample
/etc/fdfs/tracker.conf.sample
4 命令工具在 /usr/bin/ 目录下:
/usr/bin/fdfs_appender_test
/usr/bin/fdfs_appender_test1
/usr/bin/fdfs_append_file
/usr/bin/fdfs_crc32
/usr/bin/fdfs_delete_file
/usr/bin/fdfs_download_file
/usr/bin/fdfs_file_info
/usr/bin/fdfs_monitor
/usr/bin/fdfs_storaged
/usr/bin/fdfs_test
/usr/bin/fdfs_test1
/usr/bin/fdfs_trackerd
/usr/bin/fdfs_upload_appender
/usr/bin/fdfs_upload_file
5 配置FastDFS跟踪器(Tracker)
配置文件详细说明参考:FastDFS 配置文件详解
1) 进入/etc/fdfs,将tracker.conf.sample重命名tracker.conf
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
2)编辑配置文件,修改一下配置即可,其他默认。
# 配置文件是否不生效,false 为生效
disabled=false
# 提供服务的端口
port=22122
# Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)
base_path=/data/fastdfs/tracker
# HTTP 服务端口
http.server_port=80
3)创建tracker基础数据目录,即base_path对应的目录
mkdir -p /data/fastdfs/tracker
4)防火墙中打开跟踪端口(默认的22122)或关闭防火墙
5)启动tracker
/etc/init.d/fdfs_trackerd start
chkconfig fdfs_trackerd on
查看 FastDFS Tracker 是否已成功启动 ,22122端口正在被监听,则算是Tracker服务安装成功。
ss -tnlp|grep tracker
LISTEN 0 1024 *:22122 *:* users:(("fdfs_trackerd",31002,5))
6)tracker server 目录及文件结构
Tracker服务启动成功后,会在base_path下创建data、logs两个目录。目录结构如下:
tree
.
└── tracker
├── data
│ ├── fdfs_trackerd.pid
│ ├── storage_changelog.dat
│ ├── storage_groups_new.dat 分组信息
│ ├── storage_servers_new.dat 服务器信息
│ └── storage_sync_timestamp.dat
└── logs
└── trackerd.log 日志文件
6 配置FastDFS存储(Storage)
1)进入 /etc/fdfs 目录,复制 FastDFS 存储器样例配置文件 storage.conf.sample,并重命名为 storage.conf
cd /etc/fdfs
cp storage.conf.sample storage.conf
2)编辑配置文件
# 配置文件是否不生效,false 为生效
disabled=false
# 指定此 storage server 所在 组(卷)
group_name=group1
# storage server 服务端口
port=23000
# 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳)
heart_beat_interval=30
# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)
base_path=/data/fastdfs/storage
# 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。
store_path_count=1
# 逐一配置 store_path_count 个路径,索引号基于 0。
# 如果不配置 store_path0,那它就和 base_path 对应的路径一样。
store_path0=/data/fastdfs/file
# FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。
# 如果本参数只为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。
subdir_count_per_path=256
# tracker_server 的列表 ,会主动连接 tracker_server
# 有多个 tracker server 时,每个 tracker server 写一行
tracker_server=172.16.1.5:22122
tracker_server=172.16.1.6:22122
# 允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定。
sync_start_time=00:00
sync_end_time=23:59
# 访问端口
http.server_port=80
3)创建数据目录
mkdir -p /data/fastdfs/storage
mkdir -p /data/fastdfs/file
4)启动storage
启动Storage前确保Tracker是启动的。初次启动成功,会在 /ljzsg/fastdfs/storage 目录下创建 data、 logs 两个目录。
/etc/init.d/fdfs_storaged start
chkconfig fdfs_storaged on
查看 Storage 是否成功启动,23000 端口正在被监听,就算 Storage 启动成功。
ss -tnlp|grep storaged
LISTEN 0 1024 *:23000 *:* users:(("fdfs_storaged",6881,5))
5)查看Storage和Tracker是否在通信:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
--------
server_count=2, server_index=1
tracker server is 172.16.1.6:22122
group count: 1
Group 1:
group name = group1
disk total space = 99656 MB
disk free space = 20126 MB
trunk free space = 0 MB
storage server count = 2
active server count = 2
storage server port = 23000
storage HTTP port = 80
store path count = 1
subdir count per path = 256
current write server index = 0
current trunk file id = 0
Storage 1:
id = 172.16.1.5
ip_addr = 172.16.1.5 ACTIVE
http domain =
version = 5.11
······
Storage 2:
id = 172.16.1.6
ip_addr = 172.16.1.6 ACTIVE
http domain =
version = 5.11
6)Storage 目录
同 Tracker,Storage 启动成功后,在base_path 下创建了data、logs目录,记录着 Storage Server 的信息。
storage
├── data
│ ├── fdfs_storaged.pid
│ ├── storage_stat.dat
│ └── sync
│ ├── 172.16.1.5_23000.mark
│ ├── binlog.000
│ └── binlog.index
└── logs
└── storaged.log
在 store_path0 目录下,创建了N*N个子目录(这里是真正存放数据的目录):
/data/fastdfs/file/data
[root@server-06 data]# ls
00 08 10 18 20 28 30 38 40 48 50 58 60 68 70 78 80 88 90 98 A0 A8 B0 B8 C0 C8 D0 D8 E0 E8 F0 F8
01 09 11 19 21 29 31 39 41 49 51 59 61 69 71 79 81 89 91 99 A1 A9 B1 B9 C1 C9 D1 D9 E1 E9 F1 F9
02 0A 12 1A 22 2A 32 3A 42 4A 52 5A 62 6A 72 7A 82 8A 92 9A A2 AA B2 BA C2 CA D2 DA E2 EA F2 FA
03 0B 13 1B 23 2B 33 3B 43 4B 53 5B 63 6B 73 7B 83 8B 93 9B A3 AB B3 BB C3 CB D3 DB E3 EB F3 FB
04 0C 14 1C 24 2C 34 3C 44 4C 54 5C 64 6C 74 7C 84 8C 94 9C A4 AC B4 BC C4 CC D4 DC E4 EC F4 FC
05 0D 15 1D 25 2D 35 3D 45 4D 55 5D 65 6D 75 7D 85 8D 95 9D A5 AD B5 BD C5 CD D5 DD E5 ED F5 FD
06 0E 16 1E 26 2E 36 3E 46 4E 56 5E 66 6E 76 7E 86 8E 96 9E A6 AE B6 BE C6 CE D6 DE E6 EE F6 FE
07 0F 17 1F 27 2F 37 3F 47 4F 57 5F 67 6F 77 7F 87 8F 97 9F A7 AF B7 BF C7 CF D7 DF E7 EF F7 FF
7 文件上传测试
1)修改 Tracker 服务器中的客户端配置文件
cd /etc/fdfs
cp client.conf.sample client.conf
2)编辑配置文件
vim client.conf
--------
# Client 的数据和日志目录
base_path=/data/fastdfs/client
# Tracker端口
tracker_server=172.16.1.5:22122
tracker_server=172.16.1.6:22122
3) 创建client的数据目录
mkdir -p /data/fastdfs/client
4)上传文件
在linux内部执行如下命令上传 8c2a0eb3c4b922e3dd5a313f2cf802c1.jpg 图片
fdfs_upload_file /etc/fdfs/client.conf 8c2a0eb3c4b922e3dd5a313f2cf802c1.jpg
group1/M00/00/00/rBABBVs8h_iAddWuAAQzSesT6OI039.jpg
上传成功后返回文件ID号:group1/M00/00/00/rBABBVs8h_iAddWuAAQzSesT6OI039.jpg
group1 --- 组名
M00 --- 磁盘
00/00 --- 目录
rBABBVs8h_iAddWuAAQzSesT6OI039.jpg --- 文件名
四 安装nginx
上面将文件上传成功了,但我们无法下载。因此安装Nginx作为服务器以支持Http方式访问文件。同时,后面安装FastDFS的Nginx模块也需要Nginx环境。
Nginx只需要安装到StorageServer所在的服务器即可,用于访问文件。
1)使用公司的安装包安装,也可自己编译安装
yum install nginx
2)编辑配置文件
cd /etc/nginx/conf/vhosts/
vim dfs.abc.com.conf
-------
server
{
listen 80;
server_name dfs.abc.com;
add_header LoadBlance wifiin;
add_header X-Frame-Options SAMEORIGIN;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-real-ip $remote_addr;
proxy_redirect off;
proxy_max_temp_file_size 0;
location /group1/M00
{
alias /data/fastdfs/file/data;
access_log /data/logs/nginx/dfs.abc.com.log nginx_custom_log;
error_log /data/logs/nginx/dfs.abc.com.log;
}
location = /error.html
{
root /etc/nginx/html;
}
}
3)重启nginx,在浏览器中访问,成功。
/etc/init.d/nginx restart
http://dfs.abc.com/group1/M00/00/00/rBABBVs8h_iAddWuAAQzSesT6OI039.jpg
五 FastDFS配置nginx模块
fastdfs-nginx-module 模块说明
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进行文件复制, 有同步延迟的问题。
假设 Tracker 服务器将文件上传到了 192.168.51.128,上传成功后文件 ID已经返回给客户端。
此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.51.129,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.51.129 上取文件,就会出现文件无法访问的错误。
而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
1 下载fastdfs-nginx-module
# 这里为啥这么长一串呢,因为最新版的master与当前nginx有些版本问题。
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
# 解压
unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
# 重命名
mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module
# 修改config文件,否则编译nginx报错
cd /opt/tools/fastdfs-nginx-module/src
vim config
-----
将文件中的
CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
修改为
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
2 重新编译nginx
1)查看nginx的编译参数
/usr/sbin/nginx -V
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --user=nginx --group=nginx --with-threads --with-stream --with-ipv6 --with-stream_ssl_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_image_filter_module
2)重新编译
# 进入nginx的源码目录
cd /opt/tools/nginx-1.10.2
#
./configure --prefix=/etc/nginx --user=nginx --group=nginx --with-threads --with-stream --with-ipv6 --with-stream_ssl_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_image_filter_module --add-module=/opt/tools/fastdfs-nginx-module/src/
#
make
不需要执行make install,会在okjs目录中生成一个nginx的执行文件,替换现在的/usr/sbin/nginx文件即可
# 备份旧文件
mv /usr/sbin/nginx{,.`date +%F-%T`}
# 复制新文件
cp /opt/tools/nginx-1.10.2/objs/nginx /usr/sbin/nginx
# 检查
/usr/sbin/nginx -V
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --user=nginx --group=nginx --with-threads --with-stream --with-ipv6 --with-stream_ssl_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_image_filter_module --add-module=/opt/tools/fastdfs-nginx-module/src/
3 复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录, 并修改
cd /etc/fdfs/
cp /opt/tools/fastdfs-nginx-module/src/mod_fastdfs.conf ./
# 编辑配置文件
vim mod_fastdfs.conf
--------
# 连接超时时间
connect_timeout=10
# Tracker Server
tracker_server=172.16.1.5:22122
tracker_server=172.16.1.6:22122
# StorageServer 默认端口
storage_server_port=23000
# 如果文件ID的uri中包含/group**,则要设置为true
url_have_group_name = true
# Storage 配置的store_path0路径,必须和storage.conf中的一致
store_path0=/data/fastdfs/file
4复制 FastDFS 的部分配置文件到/etc/fdfs 目录
cd /opt/tools/fastdfs/fastdfs-5.11/conf
cp http.conf mime.types anti-steal.jpg /etc/fdfs/
5 配置nginx,修改nginx.conf
# 添加fastdfs-nginx模块
vim /etc/nginx/conf/vhosts/dfs.abc.com.conf
---------
server
{
listen 80;
server_name dfs.abc.com;
add_header LoadBlance wifiin;
add_header X-Frame-Options SAMEORIGIN;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-real-ip $remote_addr;
proxy_redirect off;
proxy_max_temp_file_size 0;
location ~/group([0-9])/M00
{
ngx_fastdfs_module;
access_log /data/logs/nginx/dfs.abc.com.log nginx_custom_log;
error_log /data/logs/nginx/dfs.abc.com.log;
}
location = /error.html
{
root /etc/nginx/html;
}
}
注意:
listen 80 端口值是要与 /etc/fdfs/storage.conf 中的 http.server_port=80 (前面改成80了)相对应。如果改成其它端口,则需要统一,同时在防火墙中打开该端口。
location 的配置,如果有多个group则配置location ~/group([0-9])/M00 ,没有则不用配group。
6 在 /data/fastdfs/file文件存储目录下创建软连接,将其链接到实际存放数据的目录,这一步可以省略。
ln -s /data/fastdfs/file/data /data/fastdfs/file/data/M00
7 重启nginx,测试
/usr/sbin/nginx -s reload
ngx_http_fastdfs_set pid=28807
ngx_http_fastdfs_set pid=28807
在浏览器中查看上传的文件。
能下载文件就算安装成功。注意和第三点中直接使用nginx路由访问不同的是,这里配置 fastdfs-nginx-module 模块,可以重定向文件链接到源服务器取文件。
六 权限控制
前面使用nginx支持http方式访问文件,但所有人都能直接访问这个文件服务器了,所以做一下权限控制。
FastDFS的权限控制是在服务端开启token验证,客户端根据文件名、当前unix时间戳、秘钥获取token,在地址中带上token参数即可通过http方式访问文件。
1 服务端开启token验证
# 修改http.conf
# vim /etc/fdfs/http.conf
# 设置为true表示开启token验证
http.anti_steal.check_token=true
# 设置token失效的时间单位为秒(s)
http.anti_steal.token_ttl=1800
# 密钥,跟客户端配置文件的fastdfs.http_secret_key保持一致
http.anti_steal.secret_key=FASTDFS1234567890
# 如果token检查失败,返回的页面
http.anti_steal.token_check_fail=/ljzsg/fastdfs/page/403.html
重启服务。
2 客户端配置
客户端只需要设置如下两个参数即可,两边的密钥保持一致。
# token 防盗链功能
fastdfs.http_anti_steal_token=true
# 密钥
fastdfs.http_secret_key=FASTDFS1234567890
3 注意事项
如果生成的token验证无法通过,请进行如下两项检查: A. 确认调用token生成函数(ProtoCommon.getToken),传递的文件ID中没有包含group name。传递的文件ID格式形如:M00/00/00/wKgzgFnkTPyAIAUGAAEoRmXZPp876.jpeg
B. 确认服务器时间基本是一致的,注意服务器时间不能相差太多,不要相差到分钟级别。
⑤ 对比下发现,如果系统文件隐私性较高,可以直接通过fastdfs-client提供的API去访问即可,不用再配置Nginx走http访问。配置Nginx的主要目的是为了快速访问服务器的文件(如图片),如果还要加权限验证,则需要客户端生成token,其实已经没有多大意义。
七 补充
1 storage server的七种状态
通过命令 fdfs_monitor /etc/fdfs/client.conf 可以查看 ip_addr 选项显示 storage server 当前状态:
INIT : 初始化,尚未得到同步已有数据的源服务器
WAIT_SYNC : 等待同步,已得到同步已有数据的源服务器
SYNCING : 同步中
DELETED : 已删除,该服务器从本组中摘除
OFFLINE :离线
ONLINE : 在线,尚不能提供服务
ACTIVE : 在线,可以提供服务
八 服务器更换IP地址
- 如果使用的是V4的自定义serverID特性,name比较容易,直接将tracker的IP和IP映射文件storage_ids.conf修改好即可(推荐使用这个)。
- 如果是使用IP地址作为服务器的表示,name需要修改tracker和storage的data目录下的几个数据文件,将旧IP更换为新IP
- storage的data目录下有一个.打头的隐藏文件也需要修改
- 需要将后缀为mark的IP地址和端口命名的同步位置记录文件改名
- 文件全部调整完成后才能启动集群服务
tracker server上需要调整的文件列表:
data/storage_groups_new.dat
data/storage_servers_new.dat
data/storage_sync_timestamp.dat
storage server 需要调整的文件列表:
data/.data_init_flag
data/sync/ip_addr_port.mark
九使用storage_ids
如果storage使用ids来标识,而不是用ip,这个配置文件需要配置
storage_ids.conf
<group_name> <ip_or_hostname>
100001 group1 192.168.0.196
100002 group1 192.168.0.116
client.conf 中也有两处需要修改:
use_storage_id = false
storage_ids_filename = storage_ids.conf
tracker.conf 中有三处需要修改:
use_storage_id = false
storage_ids_filename = storage_ids.conf
id_type_in_filename = ip
storage.conf中有一处 或许要修改:
group_name=group1
mod_fastdfs.conf中修改两处
use_storage_id = false
storage_ids_filename = storage_ids.conf
十 添加storage节点
# 安装新的Storage并配置mod_fastdfs.conf、storage.conf 和 storage_ids.conf
设置fdfs_storaged及nginx自启动
vim /etc/fdfs/storage.conf
tracker_server=10.10.10.1:22122
tracker_server=10.10.10.2:22122
vim /etc/fdfs/mod_fastdfs.conf
tracker_server=10.10.10.1:22122
tracker_server=10.10.10.2:22122
cat storage_ids.conf (如果fastdfs使用的ids,需要修改这个文件)
# <id> <group_name> <ip_or_hostname>
100001 group1 10.10.10.1
100002 group1 10.10.10.2
# 启动新加的storage节点(会自动同步相同group的内容)
/etc/init.d/fdfs_storage start
# 执行fdfs_monitor /etc/fdfs/client.conf查看集群同步情况(会看到新增的storage节点)
fdfs_monitor /etc/fdfs/client.conf
十一 删除storage节点
# 停止某个storage节点,fastdfs使用的ids
/etc/init.d/fdfs_storage stop
fdfs_monitor /etc/fdfs/client.conf delete group1 100002
# 查看集群情况 fdfs_monitor /etc/fdfs/client.conf 可以到对应的storage节点状态为DELETED
fdfs_monitor /etc/fdfs/client.conf
# 将 storage_ids.conf这个文件中的删除的storage的id删除,重启tracker即可
重新加入storage节点
# 启动被删除的storage节点,查看集群状态,一开始会是 OFFILINE状态
fdfs_monitor /etc/fdfs/client.conf
# 过一会儿再查看集群状态,显示为ACTIVE状态
fdfs_monitor /etc/fdfs/client.conf
十二 增加Tracker节点
# 在所有storage节点的storage.conf, mod_fastdfs.conf 中配置多条tracker_server记录
tracker_server=10.10.10.1:22122
tracker_server=10.10.10.2:22122
# 在client.conf中也配置多条tracker_server记录
执行 fdfs_monitor /etc/fdfs/client.conf 查看集群情况,可以看到tracker_serve_count变为2
另外可以指定tracker,进行集群监控 fdfs_monitor /etc/fdfs/client.conf -h 10.10.10.2 list
删除tracker节点
去掉配置文件中不需要的tracker_server的记录,停止对应服务器上的tracker进程
十三 storage节点数据不同步
# 从集群中删除storage
fdfs_monitor /etc/fdfs/client.conf delete group1 10.10.10.2
# 删除数据文件夹
rm -rf /data/fastdfs/file/data
# 重启storage
/etc/init.d/fdfs_storaged start
# 重新查状态
fdfs_monitor /etc/fdfs/client.conf