FastDFS-Nginx分布式文件系统搭建

因为不想把博客的图片放在别人的图床上,所以自己研究了个图片服务器。本人搭建的为单机方案,当然此服务器自带集群方案,只是博主没有配置。有需要集群配置方案的也很简单,改几个配置就可以了。具体集群步骤可以问问度娘。首先感谢牧佑大佬的试错总结,没有他的总结,我也写不出来这篇博客,当然我也出现了不少未知错误。话不多说,直接开始!

首先声明:本文不介绍Nginx和FastDfs的来源及应用场景,文中出现的120.\*\*.\*\*\*.165地址为博主服务器ip地址,实际搭建时请更改为自己的ip!
fastdfs 5.11 版本对照:Version 5.11对应的fastdfs-nginx-module的Version 1.20
fastdfs 5.10 版本对照:Version 5.10对应的fastdfs-nginx-module的Version 1.19
** 如果版本不对应,后期安装会报错!!!*\*

安装FastDfs

作者的GitHub地址:https://github.com/happyfish100(本次所需的工具大部分都可以找到)
首先搭建需要用到的所有工具截图

在此直接公布下载地址,毕竟时间宝贵!






到此,所需要的工具已经下载完毕。
下面开始搭建,博主使用的是阿里云轻量级服务器下的linux系统,下面的工具运行命令可看情况安装,但实际安装后已存在的工具不会重复安装,所以完全可以直接复制过去执行一遍,以防万一。
首先下载 所需全部工具运行命令

yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget

等待下载完成 然后安装rz 命令

yum install lrzsz -y

通过rz命令 或者sftp上传到/home目录下自己新建一个目录(根据个人习惯)
cd /var 进入var目录
mkdir fdfs 创建fdfs文件夹
cd fdfs 进入fdfs文件夹
rz(或直接将文件拖拽进shell窗口) 将下载好的文件传输至服务器
ls 如下图所示5个压缩文件

安装libfastcommon

解压刚才上传的文件,然后进入解压完成的文件目录
unzip libfastcommon-master.zip 解压libfastcommon-master
cd libfastcommon-master 进入libfastcommon-master
ll
我们会看到

开始安装 执行

./make.sh
./make.sh install

看看有没有报错,如果没有错误就可以执行软链接了。

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

然后回到/var/fdfs(或者你创建的文件下)
解压fastdfs
unzip fastdfs-5.11.zip
解压完成进入fastdfs5.11

cd fastdfs-5.11 
./make.sh
./make.sh install

如果没有报错那么,万里长征第一步已经成功,如果报错,请根据报错提示重装。
成功之后查看目录

[root@izwz9hx50rbasf6sqasl7vz fdfs]# cd /etc/fdfs/  
[root@izwz9hx50rbasf6sqasl7vz fdfs]# ll  
-rw-r--r-- 1 root root  1461 Jun  8 21:56 client.conf.sample  
-rw-r--r-- 1 root root  7927 Jun  8 21:56 storage.conf.sample  
-rw-r--r-- 1 root root  7389 Jun  8 21:56 tracker.conf.sample  

我们需要把这三个实例文件服务一份,去掉sample

cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf

到此~FastDFS安装结束。

安装tracker

创建tarcker工作目录
这个目录可以自定义,用来保存tracker的data和log
根据个人习惯创建下面的目录:

[root@izwz9hx50rbasf6sqasl7vz ~]# cd /var/
[root@izwz9hx50rbasf6sqasl7vz var]# mkdir fastdfs
[root@izwz9hx50rbasf6sqasl7vz var]# cd fastdfs/
[root@izwz9hx50rbasf6sqasl7vz fastdfs]# mkdir fastdfs_tracker
[root@izwz9hx50rbasf6sqasl7vz fastdfs]# cd fastdfs_tracker/
[root@izwz9hx50rbasf6sqasl7vz fastdfs_tracker]# pwd
/var/fastdfs/fastdfs_tracker        #这个是我最终创建的目录
[root@izwz9hx50rbasf6sqasl7vz fastdfs_tracker]#

配置tracker

cd /etc/fdfs
vim tracker.conf

打开后找到下面4处然后修改即可(点点111)

1. disabled=false #默认开启 
2. port=22122 #默认端口号 
3. base_path=/var/fastdfs/fastdfs_tracker #刚刚创建的目录 
4. http.server_port=6666 #默认端口是8080

保存修改文件
启动 tracker 命令如下。

service fdfs_trackerd start

如果不能成功启动,可以通systemctl命令

systemctl start fdfs_trackerd

成功之后可以看见

[root@izwz9hx50rbasf6sqasl7vz fdfs]# service fdfs_trackerd start
Starting fdfs_trackerd (via systemctl):                    [  OK  ]

进入 (点点111) 创建的tracker目录。发现目录多了data和log两个目录

[root@izwz9hx50rbasf6sqasl7vz fdfs]# cd /var/fastdfs/fastdfs_tracker/
[root@izwz9hx50rbasf6sqasl7vz fastdfs_tracker]# ll
total 0
drwxr-xr-x 2 root root 178 Jun 16 21:19 data
drwxr-xr-x 2 root root  26 Jun 13 22:01 logs

然后 我们不能每次都这么启动tracker,我们需要给tracker加入开机启动
首先需要给执行权限,

chmod +x /etc/rc.d/rc.local

然后开始修改rc.local

vim /etc/rc.d/rc.local

在配置文件最后加下最后一句话即可

#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
service fdfs_trackerd start

保存,然后 查看tracker端口监听情况

[root@izwz9hx50rbasf6sqasl7vz fastdfs_tracker]# netstat -unltp|grep fdfs
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      2233/fdfs_trackerd

到此22122端口监听成功。

安装storage

为storage配置工作目录,由于storage还需要一个目录用来存储数据,所以我另外多建了一个fastdfs_storage_data

[root@izwz9hx50rbasf6sqasl7vz fastdfs]# ls
fastdfs_storage  fastdfs_storage_data  fastdfs_tracker

修改storage配置文件
修改storage.conf

vim /etc/fdfs/storage.conf

找到如下几处地方修改即可

1. disabled=false 
2. group_name=group1 #组名,根据实际情况修改 
3. port=23000  #设置storage的端口号,默认是23000,同一个组的storage端口号必须一致 
4. base_path=/var/fastdfs/fastdfs_storage  #设置storage数据文件和日志目录 
5. store_path_count=1 #存储路径个数,需要和store_path个数匹配 
6. store_path0=/var/fastdfs/fastdfs_storage_data #实际文件存储路径 
7. tracker_server=120.**.***.165:22122 #我CentOS7的ip地址 
8. http.server_port=8888 #设置 http 端口号

保存之后 创建软引用

ln -s /usr/bin/fdfs_storaged /usr/local/bin

启动storage

service fdfs_storaged start

同理 如果不能启动可以用下述命令

systemctl start fdfs_storaged

成功应该是如下

[root@izwz9hx50rbasf6sqasl7vz fdfs]# service fdfs_stroaged start
Starting fdfs_storaged (via systemctl):                    [  OK  ]

同样设置开机启动
修改rc.local

vim /etc/rc.d/rc.local

#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
service fdfs_trackerd start
service fdfs_storaged start

同样查看服务是否启动

[root@izwz9hx50rbasf6sqasl7vz fastdfs]# netstat -unltp | grep fdfs
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      2233/fdfs_trackerd
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      2323/fdfs_storaged

服务启动,到此fastdfs已经配置完成了。最后我们再确认一下,storage是否注册到了tracker中去。

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

成功后可以看到:

ip_addr = 120.**.***.165 (localhost.localdomain) ACTIVE 的字样

ok,修改客户端配置文件

vim /etc/fdfs/client.conf

base_path=/var/fastdfs/fastdfs_tracker #tracker服务器文件路径
tracker_server=120.**.***.165:22122 #tracker服务器IP地址和端口号
http.tracker_server_port=6666 # tracker 服务器的 http端口号,必须和tracker的设置对应起来

接下来上传图片到centos7为测试
rz 命令选择一张照片 上传到随便一个目录但是 一定要复制出来
接下来

/usr/bin/fdfs_upload_file  /etc/fdfs/client.conf  /root/测试.jpg  #你上传的图片路径(linux上的)

成功之后会返回图片的路径

group1/M00/00/00/rBEcC1ykgdiALaceAACZsuwCbKE956.jpg

我们去刚才上传的路径查看是否上传成功

cd /var/fastdfs/fastdfs_storage_data/data

ls

0  0D  1A  27  34  41  4E  5B  68  75  82  8F  9C  A9  B6  C3  D0  DD  EA  F7
01  0E  1B  28  35  42  4F  5C  69  76  83  90  9D  AA  B7  C4  D1  DE  EB  F8
02  0F  1C  29  36  43  50  5D  6A  77  84  91  9E  AB  B8  C5  D2  DF  EC  F9
03  10  1D  2A  37  44  51  5E  6B  78  85  92  9F  AC  B9  C6  D3  E0  ED  FA
04  11  1E  2B  38  45  52  5F  6C  79  86  93  A0  AD  BA  C7  D4  E1  EE  FB
05  12  1F  2C  39  46  53  60  6D  7A  87  94  A1  AE  BB  C8  D5  E2  EF  FC
06  13  20  2D  3A  47  54  61  6E  7B  88  95  A2  AF  BC  C9  D6  E3  F0  FD
07  14  21  2E  3B  48  55  62  6F  7C  89  96  A3  B0  BD  CA  D7  E4  F1  FE
08  15  22  2F  3C  49  56  63  70  7D  8A  97  A4  B1  BE  CB  D8  E5  F2  FF
09  16  23  30  3D  4A  57  64  71  7E  8B  98  A5  B2  BF  CC  D9  E6  F3  M00
0A  17  24  31  3E  4B  58  65  72  7F  8C  99  A6  B3  C0  CD  DA  E7  F4
0B  18  25  32  3F  4C  59  66  73  80  8D  9A  A7  B4  C1  CE  DB  E8  F5
0C  19  26  33  40  4D  5A  67  74  81  8E  9B  A8  B5  C2  CF  DC  E9  F6
[root@izwz9hx50rbasf6sqasl7vz data]# cd 00
[root@izwz9hx50rbasf6sqasl7vz 00]# ls
00  0D  1A  27  34  41  4E  5B  68  75  82  8F  9C  A9  B6  C3  D0  DD  EA  F7
01  0E  1B  28  35  42  4F  5C  69  76  83  90  9D  AA  B7  C4  D1  DE  EB  F8
02  0F  1C  29  36  43  50  5D  6A  77  84  91  9E  AB  B8  C5  D2  DF  EC  F9
03  10  1D  2A  37  44  51  5E  6B  78  85  92  9F  AC  B9  C6  D3  E0  ED  FA
04  11  1E  2B  38  45  52  5F  6C  79  86  93  A0  AD  BA  C7  D4  E1  EE  FB
05  12  1F  2C  39  46  53  60  6D  7A  87  94  A1  AE  BB  C8  D5  E2  EF  FC
06  13  20  2D  3A  47  54  61  6E  7B  88  95  A2  AF  BC  C9  D6  E3  F0  FD
07  14  21  2E  3B  48  55  62  6F  7C  89  96  A3  B0  BD  CA  D7  E4  F1  FE
08  15  22  2F  3C  49  56  63  70  7D  8A  97  A4  B1  BE  CB  D8  E5  F2  FF
09  16  23  30  3D  4A  57  64  71  7E  8B  98  A5  B2  BF  CC  D9  E6  F3
0A  17  24  31  3E  4B  58  65  72  7F  8C  99  A6  B3  C0  CD  DA  E7  F4
0B  18  25  32  3F  4C  59  66  73  80  8D  9A  A7  B4  C1  CE  DB  E8  F5
0C  19  26  33  40  4D  5A  67  74  81  8E  9B  A8  B5  C2  CF  DC  E9  F6
[root@localhost 00]# cd 00
[root@localhost 00]# ls

rBEcC1ykgdiALaceAACZsuwCbKE956.jpg 

果然我们找到了图片了。
data下有256个1级目录,每级目录下又有256个2级子目录,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。
然后我们HTTP访问文件
http://120.**.**.165:9999/group1/M00/00/00/rBEcC1ykgdiALaceAACZsuwCbKE956.jpg

我们发现,http不能直接访问到图片。这是为什么呢。
原来早在4.05的时候,就remove embed HTTP support

Version 4.05  2012-12-30
 * client/fdfs_upload_file.c can specify storage ip port and store path index
 * add connection pool
 * client load storage ids config
 * common/ini_file_reader.c does NOT call chdir
 * keep the mtime of file same
 * use g_current_time instead of call time function
 * remove embed HTTP support

HTTP请求不能访问文件的原因

我们在使用FastDFS部署一个分布式文件系统的时候,通过FastDFS的客户端API来进行文件的上传、下载、删除等操作。同时通过FastDFS的HTTP服务器来提供HTTP服务。但是FastDFS的HTTP服务较为简单,无法提供负载均衡等高性能的服务,所以FastDFS的开发者——淘宝的架构师余庆同学,为我们提供了Nginx上使用的FastDFS模块(也可以叫FastDFS的Nginx模块)。
FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组之间的服务器需要复制文件,有延迟的问题.假设Tracker服务器将文件上传到了120...165,文件ID已经返回客户端,这时,后台会将这个文件复制到120...1651,如果复制没有完成,客户端就用这个ID在120...165取文件,肯定会出现错误。这个fastdfs-nginx-module可以重定向连接到源服务器取文件,避免客户端由于复制延迟的问题,出现错误。
正是这样,FastDFS需要结合nginx,所以取消原来对HTTP的直接支持。

FastDFS的nginx模块安装

配置storage nginx

准备nginx安装

cd /var/fdfs

在安装nginx之前要安装nginx所需的依赖lib:

yum -y install pcre pcre-devel  
yum -y install zlib zlib-devel  
yum -y install openssl openssl-devel

安装nginx并添加fastdfs-nginx-module
解压nginx,和fastdfs-nginx-module:

tar -zxvf nginx-1.12.0.tar.gz
unzip fastdfs-nginx-module-master.zip

然后进入nginx安装目录,添加fastdfs-nginx-module:

./configure --prefix=/usr/local/nginx \
--add-module=/var/fdfs/fastdfs-nginx-module-master/src    

注意,这里有个坑!一开始对nginx的插件安装并不了解,使用的是yum下载的nginx,这样下载后的nginx好像是自带了某些插件,不需要配置SSL(因为博主的博客使用nginx做的静态代理,并且使用了SSL加密)。然而!从官网下载的nginx并不带有这个插件,所有导致博主在编译的时候一直报错。因为nginx的插件是批量添加的,所以,如果配置了HTTPS代理,那么就需要按如下方式配置两个插件!

./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--add-module=/var/fdfs/fastdfs-nginx-module-master/src 

如果没有错误信息,开始安装

make
make install

这里还有个坑!make编译的时候可能会报这个错/usr/include/fastdfs/fdfs_define.h:15:27: fatal error: common_define.h: No such file or directory
下面给出解决方案:
修改fastdfs-nginx-module-1.20/src/config文件,并且重新配置一次./configure
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
配置完毕后再次./configure后进行make。
nginx的默认目录是/usr/local/nginx 开始 配置storage nginx

root@izwz9hx50rbasf6sqasl7vz nginx-1.12.0]# cd /usr/local/nginx
[root@izwz9hx50rbasf6sqasl7vz nginx]# ll

修改nginx.conf:

[root@izwz9hx50rbasf6sqasl7vz nginx]# cd conf/
[root@izwz9hx50rbasf6sqasl7vz conf]# ls
fastcgi.conf            koi-win             scgi_params
fastcgi.conf.default    mime.types          scgi_params.default
fastcgi_params          mime.types.default  uwsgi_params
fastcgi_params.default  nginx.conf          uwsgi_params.default
koi-utf                 nginx.conf.default  win-utf
[root@izwz9hx50rbasf6sqasl7vz conf]# vi nginx.conf

修改listen 9999.然后 新增本地location
`bash
server {
listen 9999;
server_name localhost;

    location / {
        root   html;
        index  index.html index.htm;
    }

    location /group1/M00 {
        root /var/fastdfs/fastdfs_storage_data/data;
        ngx_fastdfs_module;
    }
}
然后进入FastDFS安装时的解压过的目录
```bash
[root@izwz9hx50rbasf6sqasl7vz fastdfs-5.11]# cd /var/fdfs/fastdfs-5.11/conf
[root@izwz9hx50rbasf6sqasl7vz conf]# ls
anti-steal.jpg  http.conf   storage.conf      tracker.conf
client.conf     mime.types  storage_ids.conf

将http.conf和mime.types拷贝到/etc/fdfs目录下

cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/

另外还需要把fastdfs-nginx-module安装目录中src目录下的mod_fastdfs.conf也拷贝到/etc/fdfs目录下:

cp /var/fdfs/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/

对刚刚拷贝的mod_fastdfs.conf文件进行修改:

vim /etc/fdfs/mod_fastdfs.conf

base_path=/var/fastdfs/fastdfs_storage  #保存日志目录
tracker_server=120.**.***.165:22122 #tracker服务器的IP地址以及端口号
storage_server_port=23000 #storage服务器的端口号
url_have_group_name = true #文件 url 中是否有 group 名
store_path0=/var/fastdfs/fastdfs_storage_data   #存储路径
group_count = 3 #设置组的个数,事实上这次只使用了group1

在文件的最后,设置group

[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/var/fastdfs/fastdfs_storage_data
store_path1=/var/fastdfs/fastdfs_storage_data

# group settings for group #2
# since v1.14
# when support multi-group, uncomment following section as neccessary
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/var/fastdfs/fastdfs_storage_data

[group3]
group_name=group3
storage_server_port=23000
store_path_count=1
store_path0=/var/fastdfs/fastdfs_storage_dat

创建M00至storage存储目录的符号连接:

ln  -s  /var/fastdfs/fastdfs_storage_data/data/ /var/fastdfs/fastdfs_storage_data/data/M00

启动nginx:

/usr/local/nginx/sbin/nginx

成功启动:

[root@localhost conf]# /usr/local/nginx/sbin/nginx
ngx_http_fastdfs_set pid=1231


恭喜你,storage的nginx已配置成功。接下来,我们还要继续配置tracker的nginx。

配置tracker nginx

一样的还是修改nginx.conf。需将upstream指向tracker的nginx地址。

vim /usr/local/nginx/conf/nginx.conf

 upstream fdfs_group1 {
        server 127.0.0.1:9999;
    }
    server {
        listen       9989;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /group1/M00 {
            proxy_pass http://fdfs_group1;
        }
    }

重新加载nginx的配置文件:

[root@localhost conf]# /usr/local/nginx/sbin/nginx -s reload


如果 访问不了 那就修改防火墙吧(阿里服务器上请不要随意关闭防火墙,可能是安全组没有打开!)

firewall-cmd --zone=public --add-port=23000/tcp --permanent #开户端口号

或者

systemctl enable firewalld.service #开启防火墙
systemctl stop firewalld.service  #关闭防火墙(开机会仍会启动)
systemctl disable firewalld.service  #禁用防火墙(开机后不再启动)

然后在找刚才那个路径 测试

OK,到此已经结束,大功告成\~

后记

  • 本篇博客基于网上很多资料完成,按照流程搭建下来不会报错。但碍于linux环境的复杂多样,如果遇到未知错误,请多耐心查找原因(百度是个好东西!)。当然也可以联系博主~博主有时间会解答的噢。
  • FastDFS的Java客户端,点我达~

  目录