前言
FastDFS(Fast Distributed File System)是一款开源轻量级分布式文件系统。
安装libfastcommon
-
获取libfastcommon安装包:通过Xftp上传到服务器
https://github.com/happyfish100/libfastcommon/archive/V1.0.38.tar.gz
-
解压安装包:tar -zxvf V1.0.38.tar.gz
-
进入目录:cd libfastcommon-1.0.38
-
执行编译:./make.sh
-
安装:./make.sh install
可能遇到的问题:
-bash: make: command not found -bash: gcc: command not found解决方案: debian通过apt-get install gcc make安装 centos通过yum -y install gcc make安装
安装FastDFS
-
获取fdfs安装包:
https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
-
解压安装包:tar -zxvf V5.11.tar.gz
-
进入目录:cd fastdfs-5.11
-
执行编译:./make.sh
-
安装:./make.sh install
-
查看可执行命令:ls -la /usr/bin/fdfs*
配置Tracker服务
- 先建立两个文件夹
- mkdir /home/fastdfs/tracker -p
- mkdir /home/fastdfs/storage -p*
-
进入/etc/fdfs目录,有三个.sample后缀的文件(自动生成的fdfs模板配置文件),通过cp命令拷贝tracker.conf.sample,删除.sample后缀作为正式文件:
-
编辑tracker.conf:vi tracker.conf,修改相关参数
base_path=/home/fastdfs/tracker #tracker存储data和logs的路径 http.server_port=80 #http端口,需要和nginx相同 thread_stack_size = 128KB
-
启动tracker(支持start|stop|restart):
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
-
查看tracker启动日志:进入刚刚指定的base_path(/home/fastdfs/tracker)中有个logs目录,查看tracker.log文件
-
查看端口情况:netstat -apn|grep fdfs
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vWbNhCli-1621559649053)(fastDFS笔记.assets/872887-20180809201847657-2001149194.jpg)]
可能遇到的报错:
/usr/bin/fdfs_trackerd: error while loading shared libraries: libfastcommon.so: cannot open shared object file: No such file or directory 解决方案:建立libfastcommon.so软链接 ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
配置Storage服务
-
进入/etc/fdfs目录,有cp命令拷贝storage.conf.sample,删除.sample后缀作为正式文件;
-
编辑storage.conf:vi storage.conf,修改相关参数:
base_path=/home/fastdfs/storage #storage存储data和logs的跟路径,必须提前创建好 port=23000 #storge默认23000,同一个组的storage端口号必须一致 group_name=group1 #默认组名,根据实际情况修改 store_path_count=1 #存储路径个数,需要和store_path个数匹配 store_path0=/home/fastdfs/storage #如果为空,则使用base_path tracker_server=112.125.122.106:22122 #配置该storage监听的tracker的ip和port(如果有错误可选用内部ip)
-
启动storage(支持start|stop|restart):
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
-
查看端口情况:netstat -apn|grep fdfs
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q1vyw6Xb-1621559649056)(fastDFS笔记.assets/872887-20180809202028138-670884814.jpg)] -
通过monitor来查看storage是否成功绑定:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7G8GT5z-1621559649058)(fastDFS笔记.assets/872887-20180809202102192-1479269612.jpg)]
-
查看storage启动日志。
vi /home/fastdfs/storage/logs/storaged.log
查看最后几行,显示类似如下所示,表示启动成功。
[2019-07-09 17:03:51] INFO - file: tracker_client_thread.c, line: 310, successfully connect to tracker server 192.168.1.206:2
2122, as a tracker client, my ip is 192.168.1.206
[2019-07-09 17:04:21] INFO - file: tracker_client_thread.c, line: 1263, tracker server 192.168.1.206:22122, set tracker leade
r: 192.168.1.206:22122
一个测试案例
该案例是在springboot基础上进行的,下面是具体内容:
需要的依赖:
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
fastdfs-client.properties
fastdfs.connect_timeout_in_seconds=5
fastdfs.netword_timeout_in_seconds=30
fastdfs.charset=UTF-8
fastdfs.http_anti_steal_token=false
fastdfs.http_secret_key=FastDFS1234567890//默认密码
fastdfs.http_tracker_http_port=8080//与tracker.conf文件中的http.server_port=8080一致
fastdfs.tracker_servers=112.125.122.106:22122//与storage.conf文件中的tracker_server=112.125.122.106:22122一致
需要开启的端口
22122、23000、8080
TestFastDFS类
public class TestFastDFS {
private String local_filename="C:\\Users\\86135\\Desktop\\1825010260.jpg";
//上传文件
@Test
public void testUpload(){
try {
//加载fastDFS客户端配置文件
ClientGlobal.initByProperties("C:\\Users\\86135\\IdeaProjects\\fastdfs\\src\\main\\java\\com\\example\\fastdfs\\config\\fastdfs-client.properties");
System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");
System.out.println("charset=" + ClientGlobal.g_charset);
//创建一个tracker客户端和服务端
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
//定义一个storage客户端和服务端
StorageServer storageServer = null;
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
//文件元信息
NameValuePair[] metaList = new NameValuePair[1];
metaList[0] = new NameValuePair("fileName", local_filename);
//执行上传,返回文件id
String fileId = client.upload_file1(local_filename, null, metaList);
System.out.println("upload success. file id is: " + fileId);
trackerServer.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
//查询文件
@Test
public void testSelect(){
try {
//加载fastDFS客户端配置文件
ClientGlobal.initByProperties("C:\\Users\\86135\\IdeaProjects\\fastdfs\\src\\main\\java\\com\\example\\fastdfs\\config\\fastdfs-client.properties");
System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");
System.out.println("charset=" + ClientGlobal.g_charset);
//创建一个tracker客户端
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
//定义一个storage客户端
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
//查询可以根据文件id进行
FileInfo fileInfo =client.query_file_info1("group1/M00/00/00/rBE9YV8Nde2AMkxmAABPOPwk_k4219.jpg");
System.out.println(fileInfo);
trackerServer.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
//下载文件
@Test
public void testDownload(){
try {
//加载fastDFS客户端配置文件
ClientGlobal.initByProperties("C:\\Users\\86135\\IdeaProjects\\fastdfs\\src\\main\\java\\com\\example\\fastdfs\\config\\fastdfs-client.properties");
System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");
System.out.println("charset=" + ClientGlobal.g_charset);
//创建一个tracker客户端
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
//定义一个storage客户端
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
//下载可以根据文件id
byte[] bytes=client.download_file1("group1/M00/00/00/rBE9YV8Nde2AMkxmAABPOPwk_k4219.jpg");
File file =new File("C:\\Users\\86135\\Desktop\\2.jpg");
FileOutputStream fileOutputStream=new FileOutputStream(file);
fileOutputStream.write(bytes);
fileOutputStream.close();
trackerServer.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
安装Nginx和fastdfs-nginx-module模块
安装nginx相关依赖
gcc
pcre
openssl
zlib
① 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum install gcc-c++
② PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
yum install -y pcre pcre-devel
③ zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
yum install -y zlib zlib-devel
④ OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
yum install -y openssl openssl-devel
安装nginx
先进入cd /usr/local/src/fastdfs-5.11/conf
执行cp mime.types http.conf /etc/fdfs/
-
下载Nginx安装包
http://nginx.org/download/nginx-1.15.2.tar.gz
-
下载fastdfs-nginx-module安装包
https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz
-
解压nginx:tar -zxvf nginx-1.15.2.tar.gz
-
解压fastdfs-nginx-module:tar -xvf V1.20.tar.gz
-
进入nginx目录:cd nginx-1.15.2
-
配置,并加载fastdfs-nginx-module模块:(如果之前已经安装好了nginx就直接执行这一步就可以了。)(之后无需在执行./configure)
(指定安装在同级目录下的nginx中)
./configure --prefix=/usr/local/nginx --add-module=/usr/local/fastdfs-nginx-module-1.20/src/
-
编译安装:
make make install
-
查看安装路径:whereis nginx
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pjPjmpUk-1621559649061)(fastDFS笔记.assets/872887-20180809202137626-1411197392.jpg)] -
启动、停止:
cd /usr/local/nginx/sbin/ ./nginx ./nginx -s stop #此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程 ./nginx -s quit #此方式停止步骤是待nginx进程处理任务完毕进行停止 ./nginx -s reload
可能出现的错误
/usr/include/fastdfs/fdfs_define.h:15:27: 致命错误:common_define.h:没有那个文件或目录
解决办法
1、编辑fastdfs-nginx-module的配置文件
vim fastdfs/fastdfs-nginx-module-1.20/src/config
2、将原文修改为上图的两处红框圈出的地方
ngx_module_incs="/usr/local/include /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/local/include /usr/include/fastcommon/"
3、重新编译安装
./configure --prefix=/usr/local/nginx --add-module=/usr/local/fastdfs-nginx-module-1.20/src/ #解压后fastdfs-nginx-module所在的位置
make
make install
另一个问题:同时安装sll和fastdfs-nginx-module模块
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/usr/local/fastdfs-nginx-module-1.20/src/
之后make,一定不要make install
然后将刚刚编译好的nginx覆盖掉原有的nginx(这个时候nginx要停止状态)
cp ./objs/nginx /usr/local/nginx/sbin/
然后启动nginx,仍可以通过命令查看是否已经加入成功
/usr/local/nginx/sbin/nginx -V
配置Nginx和fastdfs-nginx-module模块
-
配置mod-fastdfs.conf,并拷贝到/etc/fdfs文件目录下
cd fastdfs-nginx-module-1.20/src/ cp mod_fastdfs.conf /etc/fdfs/
-
进入/etc/fdfs修改mod_fastdfs.conf:
base_path=/home/fastdfs tracker_server=10.122.149.211:22122 #tracker的地址 url_have_group_name=true #url是否包含group名称 storage_server_port=23000 #需要和storage配置的相同 store_path_count=1 #存储路径个数,需要和store_path个数匹配 store_path0=/home/fastdfs #文件存储的位置 group_count = 3 #设置组的个数,事实上这次只使用了group1
-
mod-fastdfs.conf在文件的最后,设置group
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/fastdfs/storage
store_path1=/home/fastdfs/storage
-
配置nginx,80端口server增加location如图:
cd /usr/local/nginx/conf/ vi nginx.conf
server { listen 80; server_name www.360.cn; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } //新添 location /group1/M00 { root /home/fastdfs/storage/data; ngx_fastdfs_module; }
-
最后需要拷贝fastdfs解压目录中的http.conf和mime.types:
cd /usr/local/fastdfs-5.11/conf
cp mime.types http.conf /etc/fdfs/
- 创建M00至storage存储目录的符号连接:
ln -s /home/fastdfs/data /home/fastdfs/data/M00
-
重启nginx
这样我们就可以通过nginx访问fastDFS中的文件了:(例子如下)
http://www.360zcc.cn/group1/M00/00/00/rBE9YV8OOhKAGYnmAABPOPwk_k4699.jpg
如果出现这样的问题:
nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
解决办法
使用指定nginx.conf文件的方式重启nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
此时去logs目录下查看发现nginx.pid文件已经生成了
FastDFS常用命令测试
上传文件
-
进入/etc/fdfs目录,有cp命令拷贝client.conf.sample,删除.sample后缀作为正式文件;
-
修改client.conf相关配置:
base_path=/home/fastdfs/tracker //tracker服务器文件路径 tracker_server=10.122.149.211:22122 //tracker服务器IP地址和端口号 http.tracker_server_port=80 # tracker服务器的http端口号,必须和tracker的设置对应起来
-
新建一个测试文档1.txt,内容为abc
-
命令:
/usr/bin/fdfs_upload_file <config_file> <local_filename>
-
示例:
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf 1.txt
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x3tyDSnZ-1621559649067)(https://www.cnblogs.com/handsomeye/p/media/15336343653165/15337784246114.jpg)]
组名:group1 磁盘:M00 目录:00/00 文件名称:CnqV01trmeyAbAN0AAAABLh3frE677.txt
-
查看结果,进入storage的data目录:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3jSflJH3-1621559649069)(https://www.cnblogs.com/handsomeye/p/media/15336343653165/15337784664094.jpg)] -
通过wget和浏览器方式访问成功:
wget http://10.122.149.211/group1/M00/00/00/CnqV01trmeyAbAN0AAAABLh3frE677.txt
[外链图片转存中…(img-x3tyDSnZ-1621559649067)][外链图片转存中…(img-VN6jHWHr-1621559649068)]
组名:group1 磁盘:M00 目录:00/00 文件名称:CnqV01trmeyAbAN0AAAABLh3frE677.txt
-
查看结果,进入storage的data目录:
-
通过wget和浏览器方式访问成功:
wget http://10.122.149.211/group1/M00/00/00/CnqV01trmeyAbAN0AAAABLh3frE677.txt