图片服务器(FastDFS)的搭建
1.1 什么是FastDFS
FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
1.2 文件上传流程
1.3 文件下载流程
1.4 上传文件的文件名
客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
n 组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
n 虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
n 数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
1.5 FastDFS搭建
可以使用一台虚拟机来模拟,只有一个Tracker、一个Storage服务。
配置nginx访问图片。
1.5.1 搭建步骤
第一步:把fastDFS都上传到linux系统。
第二步:安装FastDFS之前,先安装libevent工具包。
yum -y install libevent
第三步:安装libfastcommonV1.0.7工具包。
1、解压缩
2、./make.sh
3、./make.sh install
4、把/usr/lib64/libfastcommon.so文件向/usr/lib/下复制一份
第四步:安装Tracker服务。
1、解压缩
2、./make.sh
3、./make.sh install
安装后在/usr/bin/目录下有以fdfs开头的文件都是编译出来的。
配置文件都放到/etc/fdfs文件夹
4、把/root/FastDFS/conf目录下的所有的配置文件都复制到/etc/fdfs下。
5、配置tracker服务。修改/root/FastDFS/conf/tracker.conf文件。
6、启动tracker。/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
重启使用命令:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
第五步:安装storage服务。
1、如果是在不同的服务器安装,第四步的1~4需要重新执行。
2、配置storage服务。修改/root/FastDFS/conf/storage.conf文件
3、启动storage服务。
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
第六步:测试服务。
1、修改配置文件/etc/fdfs/client.conf
2、测试
/usr/bin/fdfs_test /etc/fdfs/client.conf upload anti-steal.jpg
第七步:搭建nginx提供http服务。
可以使用官方提供的nginx插件。要使用nginx插件需要重新编译。
fastdfs-nginx-module_v1.16.tar.gz
1、解压插件压缩包
2、修改/root/fastdfs-nginx-module/src/config文件,把其中的local去掉。
3、对nginx重新config
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--add-module=/root/fastdfs-nginx-module/src
2、make
3、make install
4、把/root/fastdfs-nginx-module/src/mod_fastdfs.conf文件复制到/etc/fdfs目录下。编辑:
1、nginx的配置
在nginx的配置文件中添加一个Server:
server {
listen 80;
server_name 192.168.101.3;
location /group1/M00/{
#root /home/FastDFS/fdfs_storage/data;
ngx_fastdfs_module;
}
}
2、将libfdfsclient.so拷贝至/usr/lib下
cp /usr/lib64/libfdfsclient.so /usr/lib/
3、启动nginx
nginx 400 Bad Request,详情可参考以下链接:
[root@web2 ~]# vim /etc/fdfs/mod_fastdfs.conf url_have_group_name = false 改为 true #关于啥意思,配置文件中有解释
http://www.it165.net/admin/html/201308/1628.html
1 fdfs_upload_file 2 Usage: fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index] 3 4 上传文件: 5 [root@gmxfjr-dev17 ~]# fdfs_upload_file /etc/fdfs/client.conf /etc/passwd 6 group1/M00/00/00/Co91HFlbq2WAQvMDAAAImyi5gXI5136722 7 8 下载文件: 9 [root@gmxfjr-dev17 ~]# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/Co91HFlbq2WAQvMDAAAImyi5gXI5136722 10 11 显示文件信息 12 [root@gmxfjr-dev17 ~]# fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/Co91HFlbq2WAQvMDAAAImyi5gXI5136722 13 source storage id: 0 14 source ip address: 10.143.117.28 15 file create timestamp: 2017-07-04 22:51:17 16 file size: 2203 17 file crc32: 683245938 (0x28B98172) 18 19 删除文件: 20 [root@gmxfjr-dev17 ~]# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/Co91HFlbq2WAQvMDAAAImyi5gXI5136722 21 22 文件追加 23 [root@gmxfjr-dev17 ~]# echo "hello" >> append.txt 24 [root@gmxfjr-dev17 ~]# echo "world" >> append2.txt 25 [root@gmxfjr-dev17 ~]# fdfs_upload_appender /etc/fdfs/client.conf append.txt 26 group1/M00/00/00/Co91G1lbrbGEL3ShAAAAAHcc3SA110.txt 27 [root@gmxfjr-dev17 ~]# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/Co91G1lbrbGEL3ShAAAAAHcc3SA110.txt 28 [root@gmxfjr-dev17 ~]# cat Co91G1lbrbGEL3ShAAAAAHcc3SA110.txt 29 hello 30 [root@gmxfjr-dev17 ~]# fdfs_append_file /etc/fdfs/client.conf group1/M00/00/00/Co91G1lbrbGEL3ShAAAAAHcc3SA110.txt append2.txt 31 [root@gmxfjr-dev17 ~]# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/Co91G1lbrbGEL3ShAAAAAHcc3SA110.txt 32 [root@gmxfjr-dev17 ~]# cat Co91G1lbrbGEL3ShAAAAAHcc3SA110.txt 33 hello 34 world 35 [root@gmxfjr-dev17 ~]# 36 37 健康状况 38 [root@gmxfjr-dev17 ~]# fdfs_monitor 39 Usage: fdfs_monitor <config_file> [-h <tracker_server>] [list|delete|set_trunk_server <group_name> [storage_id]] 40 [root@gmxfjr-dev17 ~]# fdfs_monitor /etc/fdfs/client.conf 41 [2017-07-04 23:06:07] DEBUG - base_path=/data/fastdfs/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=2, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0 42 43 server_count=2, server_index=1 44 45 tracker server is 10.143.117.28:22122 46 47 group count: 1 48 49 Group 1: 50 group name = group1 51 disk total space = 80505 MB 52 disk free space = 54857 MB 53 trunk free space = 0 MB 54 storage server count = 2 55 active server count = 2 56 storage server port = 23000 57 storage HTTP port = 8888 58 store path count = 1 59 subdir count per path = 256 60 current write server index = 0 61 current trunk file id = 0 62 63 Storage 1: 64 id = 10.143.117.27 65 ip_addr = 10.143.117.27 (localhost) ACTIVE 66 http domain = 67 version = 5.08 68 join time = 2017-06-25 10:40:23 69 up time = 2017-06-25 22:26:21 70 total storage = 80505 MB 71 free storage = 54857 MB 72 upload priority = 10 73 store_path_count = 1 74 subdir_count_per_path = 256 75 storage_port = 23000 76 storage_http_port = 8888 77 current_write_path = 0 78 source storage id = 79 if_trunk_server = 0 80 connection.alloc_count = 256 81 connection.current_count = 1 82 connection.max_count = 2 83 total_upload_count = 8 84 success_upload_count = 8 85 total_append_count = 1 86 success_append_count = 1 87 total_modify_count = 0 88 success_modify_count = 0 89 total_truncate_count = 0 90 success_truncate_count = 0 91 total_set_meta_count = 6 92 success_set_meta_count = 6 93 total_delete_count = 1 94 success_delete_count = 1 95 total_download_count = 3 96 success_download_count = 3 97 total_get_meta_count = 0 98 success_get_meta_count = 0 99 total_create_link_count = 0 100 success_create_link_count = 0 101 total_delete_link_count = 0 102 success_delete_link_count = 0 103 total_upload_bytes = 102166 104 success_upload_bytes = 102166 105 total_append_bytes = 6 106 success_append_bytes = 6 107 total_modify_bytes = 0 108 success_modify_bytes = 0 109 stotal_download_bytes = 1994 110 success_download_bytes = 1994 111 total_sync_in_bytes = 2215 112 success_sync_in_bytes = 2215 113 total_sync_out_bytes = 0 114 success_sync_out_bytes = 0 115 total_file_open_count = 15 116 success_file_open_count = 15 117 total_file_read_count = 3 118 success_file_read_count = 3 119 total_file_write_count = 12 120 success_file_write_count = 12 121 last_heart_beat_time = 2017-07-04 23:05:56 122 last_source_update = 2017-07-04 23:03:29 123 last_sync_update = 2017-07-04 22:59:48 124 last_synced_timestamp = 2017-07-04 22:59:40 (0s delay) 125 Storage 2: 126 id = 10.143.117.28 127 ip_addr = 10.143.117.28 ACTIVE 128 http domain = 129 version = 5.08 130 join time = 2017-06-25 22:22:24 131 up time = 2017-06-25 23:00:18 132 total storage = 80505 MB 133 free storage = 70629 MB 134 upload priority = 10 135 store_path_count = 1 136 subdir_count_per_path = 256 137 storage_port = 23000 138 storage_http_port = 8888 139 current_write_path = 0 140 source storage id = 10.143.117.27 141 if_trunk_server = 0 142 connection.alloc_count = 256 143 connection.current_count = 1 144 connection.max_count = 2 145 total_upload_count = 2 146 success_upload_count = 2 147 total_append_count = 1 148 success_append_count = 1 149 total_modify_count = 0 150 success_modify_count = 0 151 total_truncate_count = 0 152 success_truncate_count = 0 153 total_set_meta_count = 0 154 success_set_meta_count = 0 155 total_delete_count = 1 156 success_delete_count = 1 157 total_download_count = 4 158 success_download_count = 4 159 total_get_meta_count = 0 160 success_get_meta_count = 0 161 total_create_link_count = 0 162 success_create_link_count = 0 163 total_delete_link_count = 0 164 success_delete_link_count = 0 165 total_upload_bytes = 2209 166 success_upload_bytes = 2209 167 total_append_bytes = 6 168 success_append_bytes = 6 169 total_modify_bytes = 0 170 success_modify_bytes = 0 171 stotal_download_bytes = 4197 172 success_download_bytes = 4197 173 total_sync_in_bytes = 127563 174 success_sync_in_bytes = 102466 175 total_sync_out_bytes = 0 176 success_sync_out_bytes = 0 177 total_file_open_count = 22 178 success_file_open_count = 22 179 total_file_read_count = 4 180 success_file_read_count = 4 181 total_file_write_count = 18 182 success_file_write_count = 18 183 last_heart_beat_time = 2017-07-04 23:05:54 184 last_source_update = 2017-07-04 22:59:40 185 last_sync_update = 2017-07-04 23:03:30 186 last_synced_timestamp = 2017-07-04 23:03:30 (-1s delay) 187 [root@gmxfjr-dev17 ~]# 188 摘除storage: 189 1)先删除节点 190 [root@gmxfjr-dev17 ~]# fdfs_monitor /etc/fdfs/client.conf delete group1 10.143.117.28 191 [2017-07-04 23:09:06] DEBUG - base_path=/data/fastdfs/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=2, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0 192 193 server_count=2, server_index=0 194 195 tracker server is 10.143.117.27:22122 196 197 delete storage server group1::10.143.117.28 fail, error no: 16, error info: Device or resource busy 198 2)停止服务 199 [root@gmxfjr-dev18 ~]# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop 200 waiting for pid [10500] exit ... 201 pid [10500] exit. 202 [root@gmxfjr-dev18 ~]# 203 204 last_synced_timestamp = 2017-07-04 22:59:40 (0s delay) 205 Storage 2: 206 id = 10.143.117.28 207 ip_addr = 10.143.117.28 OFFLINE 208 http domain = 209 version = 5.08 210 join time = 2017-06-25 22:22:24 211 up time = 212 total storage = 80505 MB
整合php:
[root@gmxfjr-dev17 php-5.6.11]# yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libdn libdn-devel openssl openssl-devel openssldap openldap-devel nss_ldap openldap-clients
/data/fastdfs/FastDFS/php_client
测试php和fastdfs的融合
/usr/local/php/bin/php fastdfs_test.php /data/fastdfs/FastDFS/php_client
查看php安装路径:
[root@gmxfjr-dev17 php_client]# /usr/local/php/bin/php -i |grep php.ini
Configuration File (php.ini) Path => /usr/local/php/lib
Loaded Configuration File => /usr/local/php/etc/php.ini
PHP Warning: Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line 0
学习代码地址:
https://github.com/happyfish100
fastdfs+nginx的整合
https://github.com/happyfish100/fastdfs-nginx-module
Nginx整合
[root@gmxfjr-dev17 nginx-1.8.1]# ./configure --prefix=/usr/local/nginx1.8 --user=www --group=www --with-http_ssl_module --with=pcre=/usr/local/src/pcre-8.36 --add-module=/usr/local/src/fastdfs-nginx-module/src/