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地址

  1. 如果使用的是V4的自定义serverID特性,name比较容易,直接将tracker的IP和IP映射文件storage_ids.conf修改好即可(推荐使用这个)。
  2. 如果是使用IP地址作为服务器的表示,name需要修改tracker和storage的data目录下的几个数据文件,将旧IP更换为新IP
    1. storage的data目录下有一个.打头的隐藏文件也需要修改
    2. 需要将后缀为mark的IP地址和端口命名的同步位置记录文件改名
    3. 文件全部调整完成后才能启动集群服务

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