在这里,按如下配置fdfs的集群:php
跟踪服务器:
Tracker Server1 IP: 192.168.50.232
Tracker Server2 IP: 192.168.50.233
存储服务器:
Storage Server1 IP: 192.168.50.232
Storage Server2 IP: 192.168.50.233html
1、在各自的机器上安装fdfs,主要步骤以下nginx
安裝libfastcommongit
sudo wget https://github.com/happyfish100/libfastcommon/archive/master.zip sudo unzip master.zip sudo ./make.sh sudo ./make.sh install
安裝FastFDSgithub
sudo wget https://github.com/happyfish100/fastdfs/archive/master.zip sudo unzip master.zip cd fastdfs-master sudo ./make.sh sudo ./make.sh install
2、配置fdfsweb
1.修改tracker.conf的配置(/etc/fdfs/tracker.conf)
在192.168.50.232的机器上修改tracker.conf的配置以下:
bind_addr=192.168.50.232
base_path=/home/data/fastdfs 该目录根据实际须要自行修改
use_storage_id = true
id_type_in_filename = id
http.server_port=8088 端口可根据实际须要自行修改服务器
在192.168.50.233的机器上修改tracker.conf的配置以下:
bind_addr=192.168.50.233
base_path=/home/data/fastdfs 该目录根据实际须要自行修改
use_storage_id = true
id_type_in_filename = id
http.server_port=8088 端口可根据实际须要自行修改app
2.修改storage.conf的配置(/etc/fdfs/storage.conf)
在192.168.50.232的机器上修改tracker.conf的配置以下:
bind_addr=192.168.50.232
base_path=/home/data/fastdfs 该目录根据实际须要自行修改
store_path0=/home/data/fastdfs
tracker_server=192.168.50.232:22122
tracker_server=192.168.50.233:22122
http.server_port=8088 端口可根据实际须要自行修改post
在192.168.50.233的机器上修改tracker.conf的配置以下:
bind_addr=192.168.50.233
base_path=/home/data/fastdfs 该目录根据实际须要自行修改
store_path0=/home/data/fastdfs
tracker_server=192.168.50.232:22122
tracker_server=192.168.50.233:22122
http.server_port=8088 端口可根据实际须要自行修改测试
3.修改storage_ids.conf的配置(/etc/fdfs/storage_ids.conf)都配置成同样便可
100001 group1 192.168.50.232
100002 group1 192.168.50.233
4.启动服务,先分别启动tracker.conf,再分别启动storage_ids.conf
/usr/bin//fdfs_trackerd /etc/fdfs/tracker.conf start
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
ps -ef | grep fdfs查看是否启动成功,在/home/data/fastdfs/logs下,也就是上面咱们配置的数据目录下能够看到报错或者启动的日志
5.修改测试
tracker_server=192.168.50.233:22122
base_path=/home/data/fastdfs
use_storage_id = true
http.tracker_server_port=8088
测试:sudo fdfs_test /etc/fdfs/client.conf upload client.conf
3、php擴展安裝
cd /home/fastdfs/fastdfs-master/php_client/ phpize ./configure --with-php-config=/usr/bin/php-config make make install sudo sh -c "cat /home/fastdfs/fastdfs-master/php_client/fastdfs_client.ini >> /usr/local/php/etc/php.ini" 而后重启php便可
四,應用例子
本人封裝好的類:
<?php /** * Created by PhpStorm. * User: tjj * Date: 17-4-11 * Time: 上午10:15 */ class fdsf { public function __construct() { } /** * 输出fdfs的版本号 */ public function get_client_version() { return fastdfs_client_version(); } /** * 获取错误记录数 * 返回值:int */ public function fastdfs_get_last_error_no() { return fastdfs_get_last_error_no(); } /** * 获取错误信息 * 返回值:string */ public function fastdfs_get_last_error_info() { return fastdfs_get_last_error_info(); } /** * 链接到全部的tracker * 返回值:boolean */ public function fastdfs_tracker_make_all_connections() { return fastdfs_tracker_make_all_connections(); } /** * 得到小组统计信息 * 返回值:array */ public function fastdfs_tracker_list_groups($group_name = '', $tracker_server = array()) { if ($group_name) { return fastdfs_tracker_list_groups($group_name); } if ($group_name && $tracker_server) { return fastdfs_tracker_list_groups($group_name, $tracker_server); } return fastdfs_tracker_list_groups(); } /** * 获取一个tracker server链接 * 返回值:array */ public function fastdfs_tracker_get_connection() { return fastdfs_tracker_get_connection(); } /** * 状态测试 * 返回值:boolean */ public function fastdfs_active_test($obj) { return fastdfs_active_test($obj); } /** * 链接服务器 * 返回值:array */ public function fastdfs_connect_server($ip_addr = '', $port = 0) { if ($ip_addr && $port) { return fastdfs_connect_server($ip_addr, $port); } return array(); } /** * 断开服务器连接 * 返回值:boolean */ public function fastdfs_disconnect_server($server) { return fastdfs_disconnect_server($server); } /** * 获取上传服务器的信息列表 * 返回值:array */ public function fastdfs_tracker_query_storage_store_list($group_name = '', $tracker_server = array()) { if ($group_name) { return fastdfs_tracker_query_storage_store_list($group_name); } if ($group_name && $tracker_server) { return fastdfs_tracker_query_storage_store_list($group_name, $tracker_server); } return fastdfs_tracker_query_storage_store_list(); } /** * 获取storage信息 * 返回值:array */ public function fastdfs_tracker_query_storage_store($group_name = '', $tracker_server = array()) { if ($group_name) { return fastdfs_tracker_query_storage_store($group_name); } if ($group_name && $tracker_server) { return fastdfs_tracker_query_storage_store($group_name, $tracker_server); } return fastdfs_tracker_query_storage_store(); } /** * 上传本地文件到服务器 * 返回值:array */ public function fastdfs_storage_upload_by_filename($local_filename = '', $file_ext_name = null, $meta_list = array(), $group_name = null, $tracker_server, $storage_server) { return fastdfs_storage_upload_by_filename($local_filename, $file_ext_name, $meta_list, $group_name, $tracker_server, $storage_server); } /** * 上传本地文件到服务器2 * 返回值:array */ public function fastdfs_storage_upload_by_filename1($local_filename, $file_ext_name = null, $meta_list = array(), $group_name = null, $tracker, $storage) { return fastdfs_storage_upload_by_filename1($local_filename, $file_ext_name, $meta_list, $group_name, $tracker, $storage); } /** * 上传本地文件到服务器(filebuff) * 返回值:array */ public function fastdfs_storage_upload_by_filebuff($content, $file_ext_name = null, $meta_list = array()) { return fastdfs_storage_upload_by_filebuff($content, $file_ext_name, $meta_list); } /** * 以主从文件的形式上传文件。 * 参数:$local_filename:要上传的从文件;$group:主文件所诉组;$master_filename:主文件的fastdfs路径;$prefix_name:附加名称。 * 返回值:array */ public function fastdfs_storage_upload_slave_by_filename($local_filename, $group_name, $master_filename, $prefix_name) { return fastdfs_storage_upload_slave_by_filename($local_filename, $group_name, $master_filename, $prefix_name); } /** * 以主从文件的形式上传文件2。 * 参数:$local_filename:要上传的从文件;$master_file_id;$prefix_name:附加名称。 * 返回值:array */ public function fastdfs_storage_upload_slave_by_filename1($local_filename, $master_file_id, $prefix_name) { return fastdfs_storage_upload_slave_by_filename1($local_filename, $master_file_id, $prefix_name); } /** * 经过文件名获得文件详细信息 * 返回值:array */ public function fastdfs_get_file_info($group_name, $remote_filename) { if ($group_name && $remote_filename) { return fastdfs_get_file_info($group_name, $remote_filename); } return array(); } /** * 经过文件名获得文件详细信息 * 返回值:int */ public function fastdfs_storage_file_exist($group_name, $remote_filename) { if ($group_name && $remote_filename) { return fastdfs_storage_file_exist($group_name, $remote_filename); } return 0; } /** * 删除storaged 文件详细信息 * 返回值:boolean */ public function fastdfs_storage_delete_file($group_name, $remote_filename) { if ($group_name && $remote_filename) { return fastdfs_storage_delete_file($group_name, $remote_filename); } return false; } /** * 删除storaged 文件详细信息 * 返回值:boolean */ public function fastdfs_storage_delete_file1($slave_file_id) { if ($slave_file_id) { return fastdfs_storage_delete_file1($slave_file_id); } return false; } /** * 由主文件名产生从文件名 * 返回值:string */ public function fastdfs_gen_slave_filename($master_filename, $prefix_name) { if ($master_filename && $prefix_name) { return fastdfs_gen_slave_filename($master_filename, $prefix_name); } return false; } /** * 获取token * 返回值:string */ public function fastdfs_http_gen_token($remote_filename, $ts) { if ($remote_filename && $ts) { return fastdfs_http_gen_token($remote_filename, $ts); } return false; } /** * 获取文件内容 * 返回值:string */ public function fastdfs_storage_download_file_to_buff($group_name, $filename) { if ($group_name && $filename) { return fastdfs_storage_download_file_to_buff($group_name, $filename); } return false; } /** * 获取文件内容to文件 * 返回值:string */ public function fastdfs_storage_download_file_to_file($group_name, $filename, $local_filename) { if ($group_name && $filename && $local_filename) { return fastdfs_storage_download_file_to_file($group_name, $filename, $local_filename); } return false; } public function fastdfs_storage_set_metadata($group_name, $filename, $meta_list,$flag) { return fastdfs_storage_set_metadata($group_name, $filename, $meta_list,$flag); } public function fastdfs_storage_upload_slave_by_filebuff($content, $group_name,$master_filename,$prefix_name,$file_ext_name) { return fastdfs_storage_upload_slave_by_filebuff($content, $group_name,$master_filename,$prefix_name,$file_ext_name); } }
上傳示例:
upload_test.php
<html> <head> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input name="file_name" type="file"> <input name="ttt" type="text"> <input type="submit"> </form> </body> </html>
upload.php
<?php /** * Created by PhpStorm. * User: tjj * Date: 17-4-12 * Time: 上午11:28 */ include_once("./fdfs.php"); if ($_FILES["file_name"]["error"] == 0) { $f = new fdsf(); //tracker server $tracker = $f->fastdfs_tracker_get_connection(); /*var_dump($tracker); $f->fastdfs_active_test($tracker); var_dump($f->fastdfs_get_last_error_info()); exit;*/ if (!$f->fastdfs_active_test($tracker)) { echo "fastdfs_active_test errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info(); } $server = fastdfs_connect_server($tracker['ip_addr'], $tracker['port']); //storage server $storage = $f->fastdfs_tracker_query_storage_store(); if (!$storage) { echo "fastdfs_tracker_query_storage_store errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info(); exit(1); } $server = $f->fastdfs_connect_server($storage['ip_addr'], $storage['port']); if (!$server) { echo "fastdfs_connect_server errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info(); exit(1); } if (!$f->fastdfs_active_test($server)) { echo "fastdfs_active_test errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info(); exit(1); } $storage['sock'] = $server['sock']; $file_info = $f->fastdfs_storage_upload_by_filebuff(file_get_contents($_FILES["file_name"]["tmp_name"]), "jpg"); if ($file_info) { $group_name = $file_info['group_name']; $remote_filename = $file_info['filename']; file_put_contents('./upload.txt', "group_name={$group_name}|remote_filename={$remote_filename}\n", FILE_APPEND); }; var_dump($file_info); }
下載示例download.php
<?php /** * Created by PhpStorm. * User: tjj * Date: 17-4-12 * Time: 下午12:00 */ include_once("fdfs.php"); $f = new fdsf(); //tracker server $tracker = $f->fastdfs_tracker_get_connection(); if (!$f->fastdfs_active_test($tracker)) { echo "fastdfs_active_test errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info(); } $server = fastdfs_connect_server($tracker['ip_addr'], $tracker['port']); //storage server $storage = $f->fastdfs_tracker_query_storage_store(); if (!$storage) { echo "fastdfs_tracker_query_storage_store errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info(); exit(1); } $server = $f->fastdfs_connect_server($storage['ip_addr'], $storage['port']); if (!$server) { echo "fastdfs_connect_server errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info(); exit(1); } if (!$f->fastdfs_active_test($server)) { echo "fastdfs_active_test errno: " . $f->fastdfs_get_last_error_no() . ", error info: " . $f->fastdfs_get_last_error_info(); exit(1); } $storage['sock'] = $server['sock']; $local_filename = 'test.jpg'; echo 'storage_download_file_to_file result: ' . $f->fastdfs_storage_download_file_to_file("group1","M00/00/00/oYYBAFj5sbWAAJLFAAAFtidO_ME83.jpg" , $local_filename) . "\n";
PS:其实,咱们能够在测试的时候发现,在web访问时,nginx并无轮询选择tracker,而是根据本身自己所在的服务选择本身的tracker,可是储存器storager是有实现了轮询。因此当192.168.50.232上tracker的挂掉,也就192.168.50.232上的nginx上访问的用户会出现通讯失败的错误。tracker结合nginx的轮询,咱们下回分解