基于centos7.9安装FastDFS分布式文件系统和开启php扩展

参考文档:
FastDFS 分布式文件系统详解
FASTDFS简书
FASTDFS官方文档

编译环境准备

yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y

在这里插入图片描述

磁盘目录准备以及安装

mkdir /home/dfs #创建数据存储目录
cd /usr/local/src #切换到安装目录准备下载安装包

  • 安装libfastcommon
    git clone https://github.com/happyfish100/libfastcommon.git --depth 1
    cd libfastcommon/
    ./make.sh && ./make.sh install #编译安装

github克隆太慢怎么办???

  • 安装FastDFS
    cd /usr/local/src
    git clone https://github.com/happyfish100/fastdfs.git --depth 1
    cd fastdfs/
    ./make.sh && ./make.sh install #编译安装
    #配置文件准备
    cp /usr/local/src/fastdfs/conf/http.conf /etc/fdfs/ #供nginx访问使用
    cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/ #供nginx访问使用
    #tracker.conf storage.conf client.conf 默认已经有,没有的话执行下面三个命令
    cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
    cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
    cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf #客户端文件,测试用

  • 安装fastdfs-nginx-module
    cd /usr/local/src
    git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1
    #不用make
    cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs

  • 安装nginx
    cd /usr/local/src
    wget http://nginx.org/download/nginx-1.15.4.tar.gz #下载nginx压缩包
    tar -zxvf nginx-1.15.4.tar.gz #解压
    cd nginx-1.15.4/
    #添加fastdfs-nginx-module模块
    ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/
    make && make install #编译安装

因为我使用宝塔系统,已经安装了nginx,没有执行安装nginx这一步,可以在安装完fastdfs-nginx-module之后,使用宝塔把nginx卸载掉(有重要配置请备份),重新安装一次,安装时选择编译安装添加
--add-module=/usr/local/src/fastdfs-nginx-module/src/
在这里插入图片描述

单机部署配置

根据命令 ifconfig 获取本机ip

在这里插入图片描述

  • tracker配置
    #服务器ip为 上图inet,文章用 192.168.1.1做示例
    vim /etc/fdfs/tracker.conf
    #需要修改的内容如下
    port=22122 # tracker服务器端口(默认22122,一般不修改)
    base_path=/home/dfs # 存储日志和数据的根目录

  • storage配置

  • vim /etc/fdfs/storage.conf
    #需要修改的内容如下
    port=23000 # storage服务端口(默认23000,一般不修改)
    base_path=/home/dfs # 数据和日志文件存储根目录
    store_path0=/home/dfs # 第一个存储目录
    tracker_server=192.168.1.1:22122 # tracker服务器IP和端口,有多个添加多个
    http.server_port=82 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致。注意,宝塔系统的端口也为8888,所以改为82)

  • client测试
    #启动程序trackerd和storaged
    fdfs_trackerd /etc/fdfs/tracker.conf restart
    fdfs_storaged /etc/fdfs/storage.conf restart
    vim /etc/fdfs/client.conf
    #需要修改的内容如下
    base_path=/home/dfs
    tracker_server=192.168.1.1:22122 #tracker服务器IP和端口
    #保存后测试,上传预先准备的文件,返回ID表示成功 如:group1/M00/00/00/xxx.jpg
    fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/test.jpg
    在这里插入图片描述

  • 配置nginx访问

vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=192.168.1.1:22122 #tracker服务器IP和端口
url_have_group_name=true
store_path0=/home/dfs
#配置nginx.config,以下是我本地路径
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置

server {
    listen       82;    ## 该端口为storage.conf中的http.server_port相同
    server_name  localhost;
    location ~/group[0-9]/ {
        ngx_fastdfs_module;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }
}

#测试下载,用外部浏览器访问刚才已传过的test图片,能显示图片表示部署成功(注意在防火墙已开通端口)

在这里插入图片描述

分布式部署

分布式部署,主要修改每台服务的其中两个配置
假设有192.168.1.1,192.168.1.2,192.168.1.3,且都完成了单机部署

  • storage配置
    vim /etc/fdfs/storage.conf
    #需要修改的内容如下
    tracker_server=192.168.1.1:22122 # 服务器1
    tracker_server=192.168.1.2:22122 # 服务器2
    tracker_server=192.168.1.3:22122 # 服务器3
    `
  • nginx配置
    vim /etc/fdfs/mod_fastdfs.conf
    #需要修改的内容如下
    tracker_server=192.168.52.2:22122 # 服务器1
    tracker_server=192.168.52.3:22122 # 服务器2
    tracker_server=192.168.52.4:22122 # 服务器3
    url_have_group_name=true
    store_path0=/home/dfs
    #配置nginx.config
    vim /usr/local/nginx/conf/nginx.conf
    #添加如下配置
server {
    listen       82;    ## 该端口为storage.conf中的http.server_port相同
    server_name  localhost;
    location ~/group[0-9]/ {
        ngx_fastdfs_module;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }
}

PHP开启扩展和参考类文件

#进入fastdfs的php_client
cd /usr/local/src/fastdfs/php_client/
/www/server/php/73/bin/phpize #执行php的安装目录下的phpize
./configure --with-php-config=/www/server/php/73/bin/php-config
make && make install
#cp /usr/local/src/fastdfs/conf/client.conf /etc/fdfs/  
#这步已经执行过,如果没有client.conf可再执行一次
#将配置加入php.ini
cat /usr/local/src/fastdfs/php_client/fastdfs_client.ini >> /www/server/php/73/etc/php.ini

重启web服务器和php-fpm,执行

/www/server/php/73/bin/php -m|grep fastdfs_client

如果出现fastdfs_client说明配置成功!

class FastDfs{
	/**
	 * @see fastDfs扩展接口和参数,linux下有效
	 * @param string $Filename  是storage返回的remote_filename
	 * @param string $file_id  是including group name and filename
	 * @param string $group  是storage的组名
	 * @param int $timestamp int 是时间戳
	 * @param string $local_filename string 本地文件名
	 * @param string $file_ext_name string 文件扩展名
	 * @param array $meta_list  详细文件属性列表
	 * @param string $tracker_server  Fast的服务器地址
	 * @param string $storage_server  group地址
	 * @method string fastdfs_client_version(); 获取FastDFS的版本:返回值类型:字符串
	 * @method int fastdfs_get_last_error_no(); 获取错误记录数:返回值类型:int
	 * @method string fastdfs_get_last_error_info(); 获取错误信息:返回值类型:字符串
	 * @method string fastdfs_http_gen_token(string $file_id, int $timestamp) 获取产生反偷令牌函数: 返回值类型:string
	 * @method array fastdfs_get_file_info(string $group_name, string $filename); 通过文件名得到文件详细信息
	 * @method array fastdfs_get_file_info1(string $file_id); 通过文件id获取文件信息
	 * @method string fastdfs_gen_slave_filename(string $master_filename, string $prefix_name ,string $file_ext_name = ''); 由主文件名产生从文件名,出错返回error
	 * @method array fastdfs_storage_upload_by_filename(string $local_filename,string $file_ext_name ='', array $meta_list = [], string $group_name = '',array $tracker_server = [], array $storage_server = []); 上传本地文件到服务器,例如:fastdfs_storage-upload_by_filename("/zxy.jpg", null, array(), null, $tracker, $storage);
	 * @method string fastdfs_storage_upload_by_filename1(string $local_filename,string $file_ext_name ='', array $meta_list = [], string $group_name = '',array $tracker_server = [], array $storage_server = []); 上传本地文件到服务器:例如:fastdfs_storage-upload_by_filename1("/zxy.jpg", null, array(), null, $tracker, $storage);
	 * @method array fastdfs_storage_upload_by_filebuff(string $local_filename,string $file_ext_name ='', array $meta_list = [], string $group_name = '',array $tracker_server = [], array $storage_server = []); 上传文件到存储服务器的缓存:例如:fastdfs_storage-upload_by_filename1("/zxy.jpg", null, array(), null, $tracker, $storage);
	 * @method array fastdfs_storage_upload_appender_by_filename(string $local_filename,string $file_ext_name ='', array $meta_list = [], string $group_name = '',array $tracker_server = [], array $storage_server = []); 上传本地文件到存储服务器:例如:fastdfs_storage-upload_by_filename1("/zxy.jpg", null, array(), null, $tracker, $storage);
	 * @method boolean fastdfs_storage_delete_file(string $group_name, string $remote_filename,array $tracker_server = [], array $storage_server = []); 删除storage上的文件
	 * @method boolean fastdfs_storage_delete_file1(string $file_id,array $tracker_server = [], array $storage_server = []); 删除storage上的文件
	 * @method string fastdfs_storage_download_file_to_buff(string $group_name,string $remote_filename,int $file_offset = 0, int $download_bytes = 0,array $tracker_server=[], array $storage_server=[]); 下载文件:(请根据调用情况使用下载函数,url的下载可以直接参考组合url地址)
	 * @method string fastdfs_storage_download_file_to_buff1(string $file_id,int $file_offset = 0, int $download_bytes = 0,array $tracker_server=[], array $storage_server=[]); 下载文件
	 * @method boolean fastdfs_storage_download_file_to_file(string $group_name,string $remote_filename, string $local_filename,int $file_offset = 0, int $download_bytes = 0,array $tracker_server=[], array $storage_server=[]); 下载文件到本地
	 * @method boolean fastdfs_storage_set_metadata(string $group_name,string $remote_filename,array $meta_list,string $op_type='', array $tracker_server=[],array $storage_server=[]); 设置文件元数据属性
	 * @method boolean fastdfs_storage_get_metadata(string $group_name,string $remote_filename,array $tracker_server=[],array $storage_server=[]); 设置文件元数据
	 * @method array fastdfs_connect_server(string $ip_addr, int $port); 连接服务器,返回$server_info
	 * @method boolean fastdfs_disconnect_server(array $server_info); 断开服务器连接
	 * @method boolean fastdfs_active_test(array $server_info); 状态测试
	 * @method boolean fastdfs_tracker_get_connection(); 取一个tracker server连接:
	 * @method boolean fastdfs_tracker_make_all_connections(); 取一个tracker server连接:
	 * @method boolean fastdfs_tracker_close_all_connections(); 关闭所有的tracker连接
	 * @method array fastdfs_tracker_list_groups(string $group_name='', array $tracker_server=[]); 获得小组统计信息
	 * @method array fastdfs_tracker_query_storage_store(string $group_name='', array $tracker_server=[]); 获取storage信息
	 * @method array fastdfs_tracker_query_storage_store_list(string $group_name='', array $tracker_server=[]); 获取上传服务器的信息列表
	 * @method boolean fastdfs_tracker_delete_storage(string $roup_name, string $storage_ip); 删除一个存储服务器
	 */
 
 	/**
     * 上传错误信息
     * @var string
     */
    private $error = '';

    private $config = [
        'group_name'     => 'group',
    ];

    /**
     * 连接服务器
     * @var array
     */
    private $tracker;
    private $storage;

    /**
     * 构造函数,用于设置上传根路径
     * @param array $config FTP配置
     */
    public function __construct($config)
    {
        $this->config = $config;

        try {

            $this->tracker = fastdfs_tracker_get_connection();

            if (!fastdfs_active_test($this->tracker))
            {
                $this->error = fastdfs_get_last_error_info();
                return null;
            }

            $this->storage = fastdfs_tracker_query_storage_store();

            if (!$this->storage)
            {
                $this->error = fastdfs_get_last_error_info();
                return null;
            }

        } catch (\Exception $e) {
            $this->error = $e->getMessage();
            return null;
        }
    }

    public function getGroupName()
    {
        return $this->config['group_name'];
    }
    /**
     * 保存指定文件
     * @param  array $file 保存的文件信息
     * @param  boolean $replace 同名文件是否覆盖
     * @return boolean          保存状态,true-成功,false-失败
     */
    public function save(&$file, $replace = true)
    {
        $filePath = $file['tmp_name'];
        $ext= $file['ext'];
        try {
            return fastdfs_storage_upload_by_filename($filePath,$ext,[], null, $this->tracker, $this->storage);
        } catch (\Exception $e) {
            $this->error = fastdfs_get_last_error_info();
            return false;
        }
    }

    /**
     * 保存指定文件
     * @param  string $remote_filename 保存的文件信息
     * @return boolean          保存状态,true-成功,false-失败
     */
    public function delete($remote_filename)
    {
        try {

            $res = fastdfs_storage_delete_file($this->group_name, $remote_filename);
            if(!$res){
                $this->error = fastdfs_get_last_error_info();
                return false;
            }
            return true;

        } catch (FastException $e) {
            $this->error = $e->getMessage();
            return false;
        }
    }

    /**
     * 获取最后一次上传错误信息
     * @return string 错误信息
     */
    public function getError()
    {
        return $this->error;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值