FastDfs+Nginx+php_client文件系统构建

一、FastDFS简介

Fastdfs:FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

1、一般架构图

FastDFS系统结构如下图所示:
20230218_pNXn.jpg

2、上传示意图:

20230218_6wXI.jpg

上传文件交互过程:

  • client询问tracker上传到的storage,不需要附加参数;
  • tracker返回一台可用的storage;
  • client直接和storage通讯完成文件上传。

3、下载示意图

20230218_ieZW.jpg

下载文件交互过程:

  • client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
  • tracker返回一台可用的storage;
  • client直接和storage通讯完成文件下载。

二、实验环境准备

大概环境

  • 实验环境为一台已经配置好的LNMP
  • 三台空机器:centos minal( 其中1台为tracker,2台为storage )
  • lnmp ( ip : 192.168.2.206 )----上上篇博客里用到的web1
  • tracker ( ip : 192.168.2.208 )
  • storage1 ( ip : 192.168.2.209 )
  • storage2 ( ip : 192.168.2.210 )
  • vmware虚拟机 三台机器全部为nat网络模式
  • 至于怎么分按实际情况来算,也可以都扔一台上。

需要的软件:

  • FastDFS_v5.05.tar.gz
  • fastdfs-nginx-module_v1.16.tar.gz
  • libfastcommon-master.zip
  • nginx-1.7.8.tar.gz
  • pcre-8.36.tar.gz----nginx安装必须

大概说下机器上安装的软件

  • lnmp上安装FastDFS
  • tracker上安装FastDFS
  • storage上安装FastDFS和nginx

首先对三台空机器进行基本的信息配置

  • 设置IP地址、网关、DNS
  • 设置主机名(百度去吧 不一一解说)

三、tracker配置

基本信息配置

yum install  gcc gcc-c++ make openssl-devel kernel-devel zlib-devel
mkdir /data/fastdfs //用于存储
groupadd www
useradd -g www www -s /bin/false---禁止用户密码登陆
groupadd fastdfs
useradd -g fastdfs fastdfs -s /bin/false---禁止用户密码登陆

vi /etc/sysconfig/iptables 
防火墙开放端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT---storage端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT---tracker端口

service iptables restart---重启防火墙

安装libfastcommon-master,这个是FastDFS必须要安装的东西

cd /usr/local/src---下载的软件统一放在这
unzip libfastcommon-master.zip
cd libfastcommon-master
./make.sh
./make.sh install

装完后会看到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(5.05版本还比较好用,不向4.*的版本,还需要创建各种启动命令)

cd ..
tar zxvf FastDFS_v5.05.tar.gz
cd FastDFS
./make.sh 如果有问题了查一下吧 一般都是目录错位问题,可以利用copy或者创建软连接的方式解决
./make.sh install 

cd /etc/fdfs
cp tracker.conf.sample tracker.conf

编辑一下tracker.conf配置

vim tracker.conf
base_path=/data/fastdfs------日志存储目录
store_group=fastdfs----------group链接中的组名如:fastdfs/M00/00/00/oYYBAFWd9RaAd4nRAADrmdE3r9M406.png
log_level=debug--------------日志打印为debug信息会比较全
use_storage_id = true--------使用的storage_ids.conf配置文件
id_type_in_filename = id-----使用storage表示为id,原值为ip
http.server_port=80----------http端口80用来访问storage

把配置文件storage_ids.conf复制到/etc/fdfs/----fastdfs的配置文件目录

cp /usr/local/src/FastDFS/conf/storage_ids.conf /etc/fdfs/

vi /etc/fdfs/storage_ids.conf

//修改为如下
# <id>  <group_name>  <ip_or_hostname>
100001   fastdfs  192.168.2.209
100002   fastdfs  192.168.2.210

启动tracker----一般先启动tracker再启动storage,如果先启动storage的话会卡住,查看storage的日志就知道了
fdfs_trackerd /etc/fdfs/tracker.conf----启动后会在/data/fastdfs/下创建logs目录,里面有tracker.log

启动后查看下日志 看看有啥问题没有,tracker最后

cp /usr/local/src/FastDFS/conf/http.conf mime.types /etc/fdfs/ 后期用tracker上传文件测试用
vi client.conf
base_path=/data/fastdfs
tracker_server=192.168.2.208:22122
log_level=debug

四、storage配置(两台storage完全一样)

基本信息配置

yum install  gcc gcc-c++ make openssl-devel kernel-devel zlib-devel
mkdir /data/fastdfs //用于存储
groupadd www
useradd -g www www -s /bin/false---禁止用户密码登陆
groupadd fastdfs
useradd -g fastdfs fastdfs -s /bin/false---禁止用户密码登陆

vi /etc/sysconfig/iptables 
防火墙开放端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT---storage端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT---tracker端口

service iptables restart---重启防火墙

安装libfastcommon-master,这个是FastDFS必须要安装的东西

cd /usr/local/src---下载的软件统一放在这
unzip libfastcommon-master.zip
cd libfastcommon-master
./make.sh
./make.sh install

装完后会看到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(5.05版本还比较好用,不向4.*的版本,还需要创建各种启动命令)

cd ..
tar zxvf FastDFS_v5.05.tar.gz
cd FastDFS
./make.sh 如果有问题了查一下吧 一般都是目录错位问题,可以利用copy或者创建软连接的方式解决
./make.sh install

cd /etc/fdfs/
cp storage.conf.sample storage.conf
vim storage.conf

修改以下配置

group_name=fastdfs
base_path=/data/fastdfs
store_path0=/data/fastdfs
tracker_server=192.168.2.208:22122
log_level=debug
run_by_group=www
run_by_user=www
http.server_port=80

执行命令启动storage,fdfs_storaged /etc/fdfs/storage.conf 这个执行之前 必须先启动tracker,否则启动storage不动了或者卡住了,可以去看日志会报错(/data/fastdfs/logs/storage.log)

[2015-07-09 11:08:47] ERROR - file: storage_ip_changed_dealer.c, line: 180, connect to tracker server 192.168.2.208:22122 fail, errno: 113, error info: No route to host

如果有任何问题 可以去/data/fastdfs/logs看日志,执行命令后会在/data/fastdfs/下创建data和logs目录、data下是一些类似下面的目录

[root@storage1 data]# ll
total 1036
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 00
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 01
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 02
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 03
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 04
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 05
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 06
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 07
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 08
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 09
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 0A
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 0B
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 0C
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 0D
drwxr-xr-x. 258 www  www  4096 Jul  9 11:28 0E

如果以上内容成功了 则stroage配置成功并且启动成功(第六步为storage配置nginx)

五、在tracker上测试一下

配置client

cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
vi client.conf
修改以下配置项
tracker_server=192.168.2.208:22122
http.tracker_server_port=80

执行命令上传图片,如果没有通查看日志,或者看防火墙端口

fdfs_upload_file client.conf /dir/aaaaaaaaaaaa.png(随意找一个文件)
会返回类似这样的
fastdfs/M00/00/00/oYYBAFWd9RaAd4nRAADrmdE3r9M406.png
然后上第一个storage上/data/fastdfs/data/00/00发现文件被上传
[root@storage1 00]# ll
total 60
-rw-r--r--. 1 www www 60313 Jul  9 12:14 oYYBAFWd9RaAd4nRAADrmdE3r9M406.png

查看第一个storage(209上)日志 发现已经被同步到另一台storage(210)上 且查看确实存在

[2015-07-09 11:28:27] INFO - local_host_ip_count: 2,  127.0.0.1  192.168.2.209
[2015-07-09 11:28:29] INFO - file: tracker_client_thread.c, line: 310, successfully connect to tracker server 192.168.2.208:22122, as a tracker client, my ip is 192.168.2.209
[2015-07-09 11:28:59] INFO - file: tracker_client_thread.c, line: 1235, tracker server 192.168.2.208:22122, set tracker leader: 192.168.2.208:22122
[2015-07-09 11:32:00] INFO - file: storage_sync.c, line: 2698, successfully connect to storage server 192.168.2.210:23000
[2015-07-09 11:32:29] INFO - file: storage_sync.c, line: 2698, successfully connect to storage server 192.168.2.210:23000

下载文件

fdfs_download_file client.conf fastdfs/M00/00/00/oYYBAFWd9RaAd4nRAADrmdE3r9M406.png---文件将被下载到当前目录

六、为storage配置nginx

nginx的配置是必须需要pcre的(url重写和伪静态需要) 所以 要先安装pcre

cd /usr/local/src/pcre-8.36
./configure
make && make install

vim /usr/local/src/fastdfs-nginx-module/src/config,修改为
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon"

cd ../nginx-1.7.8
./configure --prefix=/usr/local/nginx  --add-module=/usr/local/src/fastdfs-nginx-module/src
make && make install----如果有错误请自行根据错误提示修复

修改nginx配置文件

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

server段加上
location /fastdfs/M00 {
        root /data/fastdfs/data;
        ngx_fastdfs_module;
}

复制mod_fastdfs.con配置文件到/etc/fdfs下

cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

编辑mod_fastdfs.con

vi /etc/fdfs/mod_fastdfs.conf
修改以下几项
base_path=/data/fastdfs
tracker_server=192.168.2.208:22122
group_name=fastdfs
store_path0=/data/fastdfs
url_have_group_name = true---意思是在url中包含名

cp /usr/local/src/FastDFS/conf/http.conf /etc/fdfs/
cp /usr/local/src/FastDFS/conf/mime.types /etc/fdfs/

启动nginx

/usr/local/nginx/sbin/nginx 

然后观察nginx错误日志 看有没有什么错误,打开192.168.2.209(210)/fastdfs/M00/00/00/oYYBAFWd9RaAd4nRAADrmdE3r9M406.png,如果都可以访问则为storage配置nginx成功

七、PHP安装fastdfs扩展

同样在lnmp机上安装fastdfs 同上一直到配置/etc/fdfs/client.conf

vi client.conf
base_path=/data/fastdfs
tracker_server=192.168.2.206:22122
#include http.conf

cd /usr/local/src/FastDFS/php_client/

编译扩展

[root@web1 php_client]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No:  20131226
Zend Extension Api No:   220131226

[root@web1 php_client]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@web1 php_client]# make
[root@web1 php_client]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

[root@web1 src]# cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
[root@web1 no-debug-non-zts-20131226]# ll
total 1496
-rwxr-xr-x  1 root root 260253 Jul  9 21:58 fastdfs_client.so
-rwxr-xr-x. 1 root root 745556 Jun 19 18:15 opcache.a
-rwxr-xr-x. 1 root root 518475 Jun 19 18:15 opcache.so

将/usr/local/src/FastDFS/php_client/fastdfs_client.ini 中的内容 全部添加到

vi /usr/local/php/etc/php.ini

重启php-fpm service php-fpm rerstart 如果在phpinfo中看到fastdfs_client的相关内容 则成功

以下是PHP的一段测试代码

$tracker = fastdfs_tracker_get_connection();
var_dump($tracker);
$storage = fastdfs_tracker_query_storage_store();
var_dump($storage);
$file_info = fastdfs_storage_upload_by_filename('/usr/local/src/yasm-1.3.0.tar.gz', null, array(), null, $tracker, $storage);
var_dump($file_info);
fastdfs_tracker_close_all_connections();

array(3) {
  ["ip_addr"]=>
  string(13) "192.168.2.206"
  ["port"]=>
  int(22122)
  ["sock"]=>
  int(5)
}
array(4) {
  ["ip_addr"]=>
  string(13) "192.168.2.206"
  ["port"]=>
  int(23000)
  ["sock"]=>
  int(-1)
  ["store_path_index"]=>
  int(0)
}
array(2) {
  ["group_name"]=>
  string(7) "fastdfs"
  ["filename"]=>
  string(44) "fastdfs/M00/00/00/oYYBAFWegiCAAgAUABbEvJTnJyo.tar.gz"
}

添加新评论