FastDFS安装部署
前言:
资源地址:链接:https://pan.baidu.com/s/1BwjWEHIGKCVAeJvlbdRmSA 提取码:7mqz
一、 安装libfastcommon
由于我的centOS7没有安装zip, 先安装 :
yum -y install unzip zip
用yum安装gcc:
yum -y install gcc-c++
安装成功后解压(先上传) libfastcommon-master.zip
unzip libfastcommon-master.zip
进入我们刚刚解压的目录:
cd libfastcommon-master
编译 libfastcommon
./make.sh
安装编译好的库
./make.sh install
libfastcommon默认会被安装到 /usr/lib64/libfastcommon.so但是FastDFS的主程序却在/usr/local/lib目录下 ,这个时候我们就要建立一个软链接了,实际上也相当于windows上的快捷方式。
ln -s /usr/lib64/libfastcommon.so /usr/local/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
解压FastDFS安装包
unzip fastdfs-5.11.zip
进到刚解压的目录
cd fastdfs-5.11
安装perl类库
yum install perl -y
编译FastDFs
./make.sh
安装编译好的类库
./make.sh install
如果没有报错那么就成功了。安装log中会提示FastDFS安装到了/etc/fdfs目录下。
成功后查看安装目录:
cd /etc/fdfs/
我们需要把这三个示例文件复制一份,去掉.sample
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf
FastDFS安装结束。
三、安装tracker
3.1创建tracker工作目录
这个目录可以自定义,用来保存tracker的data和log 。
创建下面的目录:
mkdir -p /usr/local/fdfs/tracker
3.2配置tracker
cd /etc/fdfs
vi tracker.conf
打开后重点关注下面4个配置:
1.disabled=false #默认开启
2.port=22122 #默认端口号
3.base_path=/usr/local/fdfs/tracker #我刚刚创建的目录
4.http.server_port=6666 #默认端口是8080
3.3启动tracker
保存配置后启动tracker,命令如下:
service fdfs_trackerd start
如果不能启动,或提示用systemctl可改用命令:
systemctl start fdfs_trackerd
成功后应该可以看到:
[root@localhost fdfs]# service fdfs_trackerd start
Starting fdfs_trackerd (via systemctl): [ OK ]
进行刚刚创建的tracker目录,发现目录中多了data和log两个目录
最后我们需要给tracker加入开机启动
1、查看开启启动文件权限:
ll /etc/rc.d/rc.local
-rw-r--r-- 1 root root 501 Jun 16 21:34 /etc/rc.d/rc.local
发现并没有执行权限,需要加一下:
chmod +x /etc/rc.d/rc.local
修改rc.local
vi /etc/rc.d/rc.local
在最后增加:
service fdfs_trackerd start
查看一下tracker的端口监听情况(需要先安装net-tools网络工具包:yum install net-tools -y)
netstat -antp|grep fdfs
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 2231/fdfs_trackerd
端口22122成功监听。
四、安装storage
storage的安装与tracker很类似。
4.1 为storage配置工作目录
与tracker不现的是,由于storage还需要一个目录用来存储数据,所以我另外多建了一个storage_data
mkdir -p /usr/local/fdfs/storage
mkdir -p /usr/local/fdfs/storage_data
下面是我的目录结构:
主目录: /usr/local/fdfs/storage
存储数据目录: /usr/local/fdfs/storage_data
4.2 修改storage配置文件
修改storage.conf
vi /etc/fdfs/storage.conf
1.disabled=false
2.group_name=group1 #组名,根据实际情况修改
3.port=23000 #设置storage的端口号,默认是23000,同一个组的storage端口号必须一致
4.base_path=/usr/local/fdfs/storage #设置storage数据文件和日志目录
5.store_path_count=1 #存储路径个数,需要和store_path个数匹配
6.store_path0=/usr/local/fdfs/storage_data #实际文件存储路径
7.tracker_server=192.168.188.138:22122 #我CentOS7的ip地址
8.http.server_port=8888 #设置 http 端口号
修改保存后创建软引用
ln -s /usr/bin/fdfs_storaged /usr/local/bin/
4.3 启动storage
service fdfs_storaged start
如果不能启动,或提示用systemctl可改用命令:
systemctl start fdfs_storaged
成功后应该可以看到:
Starting fdfs_storaged (via systemctl): [ OK ]
同样的,设置开机启动:
修改 rc.local
vi /etc/rc.d/rc.local
在最后增加:
service fdfs_storaged start
查看一下服务是否启动
netstat -antp|grep fdfs
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 2323/fdfs_storaged
服务已正常启动。
4.4 校验整合
到这里,fastdfs的东西都已安装完成,最后我们还要确定一下,storage是否注册到了tracker中去。
查看命令:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
成功后可以看到:
[2018-06-05 19:56:26] DEBUG - base_path=/usr/local/fdfs/storage, connect_timeout=30,
network_timeout=60, tracker_server_count=1, 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
server_count=1, server_index=0
tracker server is 192.168.188.138:22122
group count: 1
Group 1:
group name = group1
disk total space = 17394 MB
disk free space = 13880 MB
trunk free space = 0 MB
storage server count = 1
active server count = 1
storage server port = 23000
storage HTTP port = 8888
store path count = 1
subdir count per path = 256
current write server index = 0
current trunk file id = 0
Storage 1:
id = 192.168.188.138
ip_addr = 192.168.188.138 (bogon) ACTIVE
http domain =
version = 5.11
join time = 2018-06-03 18:34:42
up time = 2018-06-05 19:31:05
total storage = 17394 MB
free storage = 13880 MB
upload priority = 10
store_path_count = 1
subdir_count_per_path = 256
storage_port = 23000
storage_http_port = 8888
current_write_path = 0
source storage id =
if_trunk_server = 0
connection.alloc_count = 256
connection.current_count = 0
connection.max_count = 0
total_upload_count = 5
success_upload_count = 5
total_append_count = 0
success_append_count = 0
total_modify_count = 0
success_modify_count = 0
total_truncate_count = 0
success_truncate_count = 0
total_set_meta_count = 0
success_set_meta_count = 0
total_delete_count = 0
success_delete_count = 0
total_download_count = 0
success_download_count = 0
total_get_meta_count = 0
success_get_meta_count = 0
total_create_link_count = 0
success_create_link_count = 0
total_delete_link_count = 0
success_delete_link_count = 0
total_upload_bytes = 492292
success_upload_bytes = 492292
total_append_bytes = 0
success_append_bytes = 0
total_modify_bytes = 0
success_modify_bytes = 0
stotal_download_bytes = 0
success_download_bytes = 0
total_sync_in_bytes = 0
success_sync_in_bytes = 0
total_sync_out_bytes = 0
success_sync_out_bytes = 0
total_file_open_count = 5
success_file_open_count = 5
total_file_read_count = 0
success_file_read_count = 0
total_file_write_count = 5
success_file_write_count = 5
last_heart_beat_time = 2018-06-05 19:56:07
last_source_update = 2018-06-03 22:36:03
last_sync_update = 1970-01-01 08:00:00
last_synced_timestamp = 1970-01-01 08:00:00
五、测试文件上传
5.1 配置客户端
需要修改客户端的配置文件:
vi /etc/fdfs/client.conf
base_path=/usr/local/fdfs/tracker #tracker服务器文件路径
tracker_server=192.168.188.146:22122 #tracker服务器IP地址和端口号
http.tracker_server_port=6666 # tracker 服务器的http端口号,必须和tracker的设置对应起来
5.2 模拟上传
通过ssh客户端上传一张本地图片到root目录
确定图片位置后,我们输入上传图片命令把图片上传到FastDFS服务器:
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/1.jpg #这后面放的是图片的位置
成功后会返回图片的路径:group1/M00/00/00/wKi8ilsWfg2AI2fRAADg3sO_IT8991.jpg
组名:group1
磁盘:M00
目录:00/00
文件名称:wKi8ilsWfg2AI2fRAADg3sO_IT8991.jpg
我们上传的图片会被上传到我们创建的storage_data目录下,让我们去看看:
cd /usr/local/fdfs/storage_data/data
ls
00 0A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96 A0 AA B4 BE C8 D2 DC E6 F0 FA
01 0B 15 1F 29 33 3D 47 51 5B 65 6F 79 83 8D 97 A1 AB B5 BF C9 D3 DD E7 F1 FB
02 0C 16 20 2A 34 3E 48 52 5C 66 70 7A 84 8E 98 A2 AC B6 C0 CA D4 DE E8 F2 FC
03 0D 17 21 2B 35 3F 49 53 5D 67 71 7B 85 8F 99 A3 AD B7 C1 CB D5 DF E9 F3 FD
04 0E 18 22 2C 36 40 4A 54 5E 68 72 7C 86 90 9A A4 AE B8 C2 CC D6 E0 EA F4 FE
05 0F 19 23 2D 37 41 4B 55 5F 69 73 7D 87 91 9B A5 AF B9 C3 CD D7 E1 EB F5 FF
06 10 1A 24 2E 38 42 4C 56 60 6A 74 7E 88 92 9C A6 B0 BA C4 CE D8 E2 EC F6
07 11 1B 25 2F 39 43 4D 57 61 6B 75 7F 89 93 9D A7 B1 BB C5 CF D9 E3 ED F7
08 12 1C 26 30 3A 44 4E 58 62 6C 76 80 8A 94 9E A8 B2 BC C6 D0 DA E4 EE F8
09 13 1D 27 31 3B 45 4F 59 63 6D 77 81 8B 95 9F A9 B3 BD C7 D1 DB E5 EF F9
cd 00/00
ll
果然通过刚刚返回的路径,我们成功找到了图片。
我们仔细看一下,实际文件存储路径下有创建好的多级目录。data下有256个1级目录,每级目录下又有256个2级子目录,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。
六、FastDFS的nginx模块安装
6.1安装nginx准备
在安装nginx之前要安装nginx所需的依赖lib:
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel
6.2 安装nginx并添加fastdfs-nginx-module
解压nginx,和 fastdfs-nginx-module:
tar -zxvf nginx-1.12.0.tar.gz
unzip fastdfs-nginx-module-master.zip
解压后进入nginx目录编译安装nginx,并添加fastdfs-nginx-module:
cd /root/nginx-1.12.0
./configure --prefix=/usr/local/nginx --add-module=/root/fastdfs-nginx-module-master/src
第一个目录是nginx安装目录,第二个目录是fastdfs-nginx-module源码目录
如果配置不报错的话,开始编译:
make
编译安装:
make install
nginx的默认目录是/usr/local/nginx,安装成功后查看:
cd /usr/local/nginx
ll
drwx------. 2 nobody root 6 Jun 3 19:53 client_body_temp
drwxr-xr-x. 2 root root 4096 Jun 3 20:36 conf
drwx------. 2 nobody root 6 Jun 3 19:53 fastcgi_temp
drwxr-xr-x. 2 root root 40 Jun 3 19:36 html
drwxr-xr-x. 2 root root 58 Jun 5 19:31 logs
drwx------. 2 nobody root 6 Jun 3 19:53 proxy_temp
drwxr-xr-x. 2 root root 19 Jun 3 19:36 sbin
drwx------. 2 nobody root 6 Jun 3 19:53 scgi_temp
drwx------. 2 nobody root 6 Jun 3 19:53 uwsgi_temp
6.3 配置storage nginx
修改nginx.conf:
cd /usr/local/nginx/conf
vi nginx.conf
修改监听端口 listen 9999, 新增location
server {
listen 9999;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
# 需要添加的代码
location ~/group1/M00 {
root /usr/local/fdfs/storage_data/data;
ngx_fastdfs_module;
}
# end
location = /50x.html {
root html;
}
}
然后进入FastDFS安装时的解压过的目录,将http.conf和mime.types拷贝到/etc/fdfs目录下:
cd /root/fastdfs-5.11/conf
cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/
另外还需要把 fastdfs-nginx-module 安装目录中 src目录下的mod_fastdfs.conf也拷贝到/etc/fdfs目录下:
cd /root/fastdfs-nginx-module-master/src
cp mod_fastdfs.conf /etc/fdfs/
对刚刚拷贝的mod_fastdfs.conf文件进行修改:
vi /etc/fdfs/mod_fastdfs.conf
base_path=/usr/local/fdfs/storage #保存日志目录
tracker_server=192.168.188.146:22122 #tracker服务器的IP地址以及端口号
storage_server_port=23000 #storage服务器的端口号
url_have_group_name = true #文件 url 中是否有 group 名
store_path0=/usr/local/fdfs/storage_data #存储路径
group_count = 1 #设置组的个数,事实上这次只使用了group1
在文件的最后,设置group
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/usr/local/fdfs/storage_data
...多组的继续设置group2、group3
创建M00至storage存储目录的符号连接:
ln -s /usr/local/fdfs/storage_data/data/ /usr/local/fdfs/storage_data/data/M00
启动nginx:
/usr/local/nginx/sbin/nginx
成功启动:ngx_http_fastdfs_set pid=8142
设置开机自动启动nginx:
修改rc.local
vi /etc/rc.d/rc.local
在最后增加:
浏览器访问 http://192.168.188.138:9999 (根据自己IP访问)
storage的nginx已配置成功。接下来,我们还要继续配置tracker的nginx。
6.4 配置tracker nginx
再解压一个nginx:
我在我自己的工作下再建了一个nginx2,把原来的nginx-1.12.0.tar.gz又解压了一份到里面
cd ~
mkdir nginx2
tar -xvf nginx-1.12.0.tar.gz -C /root/nginx2
进入到nginx2目录,设置编译配置
cd /root/nginx2/nginx-1.12.0
./configure --prefix=/usr/local/nginx2 --add-module=/root/fastdfs-nginx-module-master/src
如果配置不报错的话,开始编译:
make
编译安装:
make install
nginx的安装目录是 /usr/local/nginx2
接下来,一样的还是修改nginx.conf,端口号可以不改,用80的。需将upstream指向tracker的nginx地址。
vi /usr/local/nginx2/conf/nginx.conf
upstream fdfs_group1 {
server 127.0.0.1:9999;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /group1/M00 {
proxy_pass http://fdfs_group1;
}
#location / {
# root html;
# index index.html index.htm;
#}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
启动nginx:
/usr/local/nginx2/sbin/nginx
设置开机自动启动nginx:
修改rc.local
vi /etc/rc.d/rc.local
在最后增加:
/usr/local/nginx2/sbin/nginx
浏览器访问 http://192.168.188.138
6.5 HTTP测试
现在我们再去访问一下,原来我们上传过的文件:
http://192.168.188.146/group1/M00/00/00/wKi8ilsWiS2AbyWrAADg3sO_IT8536.jpg
七、使用maven项目编写图片上传demo
7.1 pom.xml 依赖
<dependency>
<groupId>cn.bestwu</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27</version>
</dependency>
7.2 fdfs_client.conf 配置文件
在 maven项目的resources文件夹下创建 fdfs_client.conf 配置文件
# 改成自己的IP
tracker_server=182.254.229.119:22122
7.3 main方法
在测试文件夹下创建一个测试类TestStorageClient,并编写main方法。将第六条的图片路径更改成自己本地的图片地址。
public class TestStorageClient {
public static void main(String[] args) throws IOException, MyException {
// 1、加载配置文件,配置文件中的内容就是 tracker 服务的地址。
ClientGlobal.init("./src/main/resources/fdfs_client.conf");
// 2、创建一个 TrackerClient 对象。直接 new 一个。
TrackerClient trackerClient = new TrackerClient();
// 3、使用 TrackerClient 对象创建连接,获得一个 TrackerServer 对象。
TrackerServer trackerServer = trackerClient.getConnection();
// 4、创建一个 StorageServer 的引用,值为 null
StorageServer storageServer = null;
// 5、创建一个 StorageClient 对象,需要两个参数 TrackerServer 对象、StorageServer 的引用
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 6、使用 StorageClient 对象上传图片。
//扩展名不带“.”
String[] strings = storageClient.upload_file("D:/cat.jpg", "jpg",
null);
// 7、返回数组。包含组名和图片的路径。
for (String string : strings) {
System.out.println(string);
}
// http://182.254.229.119/group1/M00/00/00/CgAIDV_9PbOAclrBAACvSmRH5h8087.jpg night.jpg
/*http://182.254.229.119/group1/M00/00/00/CgAIDV_9QEeABcBNAABanGTtiQw792.jpg Cat 猫*/
}
}
main方法执行成功后返回的数据为 : 组名和图片的路径。
浏览器访问 :http://182.254.229.119/group1/M00/00/00/CgAIDWBI1aGAPpM4AABanGTtiQw241.jpg