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 #切换到安装目录准备下载安装包
- 安装libfastcommongit clone https:///happyfish100/libfastcommon.git --depth 1cd libfastcommon/./ && ./ install #编译安装
github克隆太慢怎么办???
- 安装FastDFScd /usr/local/srcgit clone https:///happyfish100/fastdfs.git --depth 1cd fastdfs/./ && ./ 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.confcp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.confcp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf #客户端文件,测试用
- 安装fastdfs-nginx-modulecd /usr/local/srcgit clone https:///happyfish100/fastdfs-nginx-module.git --depth 1#不用makecp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
- 安装nginxcd /usr/local/srcwget 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和storagedfdfs_trackerd /etc/fdfs/tracker.conf restartfdfs_storaged /etc/fdfs/storage.conf restartvim /etc/fdfs/client.conf#需要修改的内容如下base_path=/home/dfstracker_server=192.168.1.1:22122 #tracker服务器IP和端口#保存后测试,上传预先准备的文件,返回ID表示成功 如:group1/M00/00/00/xxx.jpgfdfs_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=truestore_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 # 服务器1tracker_server=192.168.1.2:22122 # 服务器2tracker_server=192.168.1.3:22122 # 服务器3 `
- nginx配置vim /etc/fdfs/mod_fastdfs.conf#需要修改的内容如下tracker_server=192.168.52.2:22122 # 服务器1tracker_server=192.168.52.3:22122 # 服务器2tracker_server=192.168.52.4:22122 # 服务器3url_have_group_name=truestore_path0=/home/dfs#配置nginx.configvim /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;
}
}