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(本次所需的工具大部分都可以找到) 首先搭建需要用到的所有工具截图
- fastdfs 5.11 点击如下图即可,完成下载。 https://github.com/happyfish100/fastdfs/releases
- fastdfs-client-java-master 点击如下图即可,完成下载。 https://github.com/happyfish100/fastdfs-client-java
- fastdfs-nginx-module-master 点击如下图即可,完成下载。 https://github.com/happyfish100/fastdfs-nginx-module
- libfastcommon-master 点击如下图即可,完成下载。 https://github.com/happyfish100/libfastcommon
- nginx-1.12.0.tar 点击如下图即可,完成下载。 http://nginx.org/download/
到此,所需要的工具已经下载完毕。 下面开始搭建,博主使用的是阿里云轻量级服务器下的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_storaged 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
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安装时的解压过的目录
[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客户端,点我达~