前言:FastDFS 我也是第一次玩,在安装的过程当中我搜集了很多资料,整了很长时间。我发现百度上虽然有很多的资料,但是大多数资料讲解的都不是很详细,对于我这种菜鸟来说,有很多的困扰,到现在也没有弄明白。但是经过不懈的努力,终于是初步的把环境给搭起来了,经过初步测试,暂时没有发现问题,能正常使用,所以我想把这个过程详细的写下来,一是加强自己的记忆,二是以后忘记了也能翻出来看看,三是为了能够给像我一样的菜鸟提供一点参考意见。
首先,tracker 和 storage 可以装在同一台虚拟机上,也可以分开装在两台虚拟机上。
准备安装包:
① libfastcommonV1.0.7.tar.gz
② FastDFS_v5.05.tar.gz
③ nginx-1.8.0.tar.gz
开始安装!(基于CentOS7,我装了两台tracker、两台storage)
1. tracker 和 storage 公共部分的安装(tracker 和 storage 都是 FastDFS 的一部分,所以它们有一些共同的环境依赖,四台虚拟机都需要安装下面的环境)
1.1 安装 FastDFS 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,需要安装 gcc 环境。
安装命令:yum install gcc-c++
1.2 FastDFS 依赖 libevent 库,所以需要安装 libevent 。
安装命令:yum -y install libevent
1.3 ,libfastcommon 包含了 FastDFS 运行所需要的一些基础库,所以需要安装 libfastcommon 。
1.3.1 将 libfastcommonV1.0.7.tar.gz 拷贝至/usr/local/下(没有的话自己去下载)
1.3.2 cd /usr/local
1.3.3 解压:tar -zxvf libfastcommonV1.0.7.tar.gz
1.3.4 解压完成后,进入安装目录:cd libfastcommon-1.0.7
1.3.5 编译:./make.sh
1.3.6 安装:./make.sh install
注意:libfastcommon 安装好后会自动将库文件拷贝至/usr/lib64下,由于 FastDFS 程序引用 usr/lib 目录所以需要将/usr/lib64 下的库文件拷贝至/usr/lib 下。
要拷贝的文件如下:/usr/lib64/libfastcommon.so
拷贝命令:cp /usr/lib64/libfastcommon.so /usr/lib/
1.4 FastDFS 安装(其实 FastDFS 安装好后就包含了 tracker 和storage ,而我们说的安装 tracker 和安装 storage 其实是对安装了 FastDFS 的虚拟机进行一些不同的配置)
1.4.1 将 FastDFS_v5.05.tar.gz 拷贝至/usr/local/下(没有自己去下载)
1.4.2 解压:tar -zxvf FastDFS_v5.05.tar.gz
1.4.3 解压完成后,进入安装目录:cd FastDFS
1.4.4 编译:./make.sh
1.4.5 安装:./make.sh install
1.4.6 安装成功后将安装目录下的 conf 目录下的文件拷贝到/etc/fdfs/下,需要拷贝的文件如下图
注意:无论你要装多少台 tracker 和 storage 都要走上面这几步,也就是每台虚拟机上面都要装这些东西。
2. 安装 tracker (其实 tracker 已经安装好了,现在是来配置 tracker ,你准备把哪台虚拟机作为 tracker 使用,就在哪台虚拟机上配置。我这里配置的是 192.168.43.168 和 192.168.43.242 两台虚拟机)
2.1 进入/etc/fdfs 目录:cd /etc/fdfs
2.2 拷贝一份新的 tracker 配置文件:cp tracker.conf.sample tracker.conf
2.3 修改 tracker.conf:vim ./tracker.conf
base_path=/home/yuqing/FastDFS
改为:
base_path=/home/FastDFS
配置 http 端口:
http.server_port=80
2.4 创建文件夹(/home/FastDFS 文件夹是不会自动创建的,如果不自行创建的话,fdfs_tracker 将无法启动):mkdir /home/FastDFS/
2.5 启动:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
启动的日志显示先停止 8180 进程(你的环境下不是 8180 了)再启动,如下图:
注意:
①有可能你启动的时候没有任何日志输出,这个有可能是没有正常关闭造成的,你只需要再尝试启动一次就行了。启动成功了,就说明 tracker 没问题了。
②作为 tracker 的两台虚拟机一样配置就行。
③你在配置 tracker 的时候用到了两个端口 (22122、80),你得确保这两个端口是开放的,执行下图命令,ports 那一行就是你所有开放的端口,如果没有,那你得开放这两个端口
3. 安装 storage(其实 storage 也已经安装好了,现在是配置 storage ,你想用哪台虚拟机做 storage ,那就在哪台虚拟机上进行配置。我这里配置的是 192.168.43.224 和 192.168.43.2 这两台虚拟机)
3.1 进入/etc/fdfs 目录:cd /etc/fdfs
3.2 拷贝一份新的 storage 配置文件:cp storage.conf.sample storage.conf
3.3 修改 storage.conf:vim ./storage.conf
需要修改的内容:
group_name=group1
base_path=/home/yuqing/FastDFS 改为:base_path=/home/FastDFS
store_path0=/home/yuqing/FastDFS 改为:store_path0=/home/fastdfs/fdfs_storage
#如果有多个挂载磁盘则定义多个 store_path,如下
#store_path1=.....
#store_path2=......
tracker_server=192.168.43.168:22122 #配置 tracker 服务器:IP
#如果有多个则配置多个 tracker
tracker_server=192.168.43.242:22122
#配置 http 端口
http.server_port=80
3.4 创建文件夹(/home/FastDFS 在上面已经创建过了,只需要再创建 /home/fastdfs/fdfs_storage 即可):mkdir /home/fastdfs/fdfs_storage/
3.5 启动:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
启动的日志显示先停止 56244 进程(你的环境就不是 56244 了)再启动,如下图:
注意:
①有可能你启动的时候没有任何日志输出,这个有可能是没有正常关闭造成的,你只需要再尝试启动一次就行了。启动成功了,就说明 storage 没问题了。
②作为 storage 的两台虚拟机一样配置就行。
③你在配置 storage 的时候用到了两个端口 (23000、80),你得确保这两个端口是开放的,执行下图命令,ports 那一行就是你所有开放的端口,如果没有,那你得开放这两个端口;如果你的 tracker 和 storage 安装在一台服务器上的话,那必须要保证端口不能有冲突,这里就需要把 80 端口换成其他端口。
④tracker 和 storage 都配置并启动好之后查看一下进程,确保没有问题即可。使用命令:ps -ef | grep fdfs ,出现如下图所示结果即可。
4. 安装 nginx (tracker 上不需要安装,只需要在 storage 上安装即可)
4.1 安装 nginx 所需要的环境
4.1.1 安装 gcc 的环境。
安装命令:yum install gcc-c++
注意:这一步在安装 FastDFS 的时候做过,所以可以省略。
4.1.2 nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库。
安装命令:yum install -y pcre pcre-devel
4.1.3 zlib 库提供了很多种压缩和解压缩的方式,nginx 使用 zlib 对 http 包的内容进行 gzip,所以需要在 linux 上安装 zlib 库。
安装命令:yum install -y zlib zlib-devel
4.1.4 OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在 ssl 协议上传输 http),所以需要在 linux安装 openssl 库。
安装命令:yum install -y openssl openssl-devel
4.2 安装 nginx
4.2.1 把 nginx 的源码包 nginx-1.8.0.tar.gz上传到 /usr/local (源码包没有自己去下载)
4.2.2 解压:tar -zxvf nginx-1.8.0.tar.gz
4.2.3 解压完成后,进入安装目录:cd nginx-1.8.0/
4.2.4 使用 configure 命令创建一 makeFile 文件(下面这是一个命令)
./configure \
--prefix=/usr/local/nginx \
--add-module=/usr/local/fastdfs-nginx-module/src
(注意:--prefix=/usr/local/nginx \ 这一行是指向nginx的启动目录,不需要更改,默认就行,目录/usr/local/nginx/ 没有自己创建一下。/usr/local/nginx-1.8.0 是nginx解压后的目录,但是/usr/local/nginx 是nginx的启动目录,默认是没有的,需要自己创建。 --add-module=/usr/local/fastdfs-nginx-module/src 这一行是指向 fastdfs-nginx-module 模块的src目录的,按照自己的情况进行更改就好,后面整合的时候会有,暂时不用关心。
)
执行上面这一条命令后可以看到 Makefile 文件,如图:
4.2.5 编译:make
注意:这一步如果报错的话,执行如下命令再重新执行 make 命令
① yum -y install make zlib-devel gcc-c++ libtool openssl openssl-devel
② ./configure
4.2.6 安装:make install
4.2.7 启动nginx 之前,上边将临时文件目录指定为/var/temp/nginx/client, 需要在/var 下创建此目录:mkdir /var/temp/nginx/client -p
4.2.8 进入到Nginx目录下的sbin目录:cd /usr/local/nginx-1.8.0/sbin
4.2.9 启动Nginx:./nginx
4.2.10 启动后查看进程:ps -ef | grep nginx
附赠:关闭 nginx 命令:./nginx -s stop
重启 nginx 命令:./nginx -s reload
5. 整合 FastDFS 和 nginx
5.1 将 fastdfs-nginx-module_v1.16.tar.gz 上传到 storage 服 务 器 的 /usr/local/ 下(没有 fastdfs-nginx-module_v1.16.tar.gz 的话自己下载)
5.2 cd /usr/local/
5.3 解压:tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
5.4 解压完成后进入安装目录:cd fastdfs-nginx-module/src
5.5 修改 config 文件:vim config
修改内容:将/usr/local/路径改为/usr/ (有三处要改,改成下图所示)
5.6 将 fastdfs-nginx-module/src 下的 mod_fastdfs.conf 拷贝至/etc/fdfs/下:cp mod_fastdfs.conf /etc/fdfs/
5.7 修改 mod_fastdfs.conf 的内容:vim /etc/fdfs/mod_fastdfs.conf
修改内容:
base_path=/home/fastdfs
tracker_server=192.168.43.168:22122
tracker_server=192.168.43.242:22122
url_have_group_name=true #url 中包含 group 名称
store_path0=/home/fastdfs/fdfs_storage #指定文件存储路径
#如果有多个
5.8 将 libfdfsclient.so 拷贝至/usr/lib 下:cp /usr/lib64/libfdfsclient.so /usr/lib/
5.9 创建 nginx/client 目录:mkdir -p /var/temp/nginx/client
5.10 进入nginx的启动目录/usr/local/nginx,修改 nginx.conf :
cd /usr/local/nginx/conf/
5.11 添加虚拟主机 :
server {
listen 80;
server_name 192.168.101.65;
location /group1/M00/{
root /home/FastDFS/fdfs_storage/data;
ngx-fastdfs-module;
}
如图:
说明:
server_name 指定当前虚拟机的 ip
location /group1/M00/:group1 为 nginx 服务 FastDFS 的分组名称,M00 是 FastDFS
自动生成编号,对应 store_path0=/home/FastDFS/fdfs_storage,如果 FastDFS 定义
store_path1,这里就是 M01。
ngx_fastdfs_module 是固定的,不用变。
6. 启动
1、启动tracker:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
2、启动storage:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
3、启动storage上的nginx:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
4、启动图片虚拟主机(本机上的) nginx
7. 测试
7.1 直接在虚拟机上测试
FastDFS 安装成功可通过/usr/bin/fdfs_test 程序来测试上传、下载等操作。
7.1.1 修改/etc/fdfs/client.conf :vim /etc/fdfs/client.conf
修改内容:
base_path=/home/fastdfs
tracker_server=192.168.43.168:22122
tracker_server=192.168.43.242:22122
7.1.2 上传图片的命令格式:/usr/bin/fdfs_test 客户端配置文件地址 upload 上传文件
比如将/home 下的图片上传到 FastDFS 中:
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/tomcat.jpg
7.1.3 上传成功后打印的日志如下
7.2 java 代码测试
7.2.1 创建一个简单的SpringBoot项目,目录结构如下
7.2.2 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>xc-framework-parent</artifactId>
<groupId>com.xuecheng</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../xc-framework-parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>test-fastdfs</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java -->
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</project>
7.2.3 fastdfs-client.properties
fastdfs.connect_timeout_in_seconds = 30 #http连接超时时间
fastdfs.network_timeout_in_seconds = 30 #tracker与storage网络通信超时时间
fastdfs.charset = UTF-8 #字符编码
fastdfs.tracker_servers = 192.168.43.168:22122,192.168.43.242:22122 #tracker服务器地址,多个地址中间用英文逗号分隔
注意:这里最好不要把注释写进配置文件,否则可能造成格式问题,导致程序抛异常。
7.2.4 测试类 TestFastDFS
package com.xuecheng.test.fastdfs;
import org.csource.common.MyException;
import org.csource.fastdfs.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author Administrator
* @version 1.0
**/
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestFastDFS {
//上传文件
@Test
public void testUpload() {
try {
//加载fastdfs‐client.properties配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");
System.out.println("charset=" + ClientGlobal.g_charset);
//定义TrackerClient,用于请求TrackerServer
TrackerClient trackerClient = new TrackerClient();
//连接tracker Server
TrackerServer trackerServer = trackerClient.getConnection();
if (trackerServer == null) {
System.out.println("getConnection return null");
return;
}
//获取一个storage server
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
if (storageServer == null) {
System.out.println("getStoreStorage return null");
}
//创建一个storage存储客户端
StorageClient1 storageClient1 = new StorageClient1(trackerServer, storageServer);
//本地文件的路径
String filePath = "D:\\pictures\\coffer.jpg";
String fileId = null;
//文件上传成功后会返回一个文件id
fileId = storageClient1.upload_file1(filePath, "jpg", null);
System.out.println("Upload local file " + filePath + " ok, fileid=" + fileId);
} catch (Exception ex) {
ex.printStackTrace();
}
}
//查询文件
@Test
public void testQueryFile() throws IOException, MyException {
//加载fastdfs‐client.properties配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
//定义TrackerClient,用于请求TrackerServer
TrackerClient trackerClient = new TrackerClient();
//连接tracker Server
TrackerServer trackerServer = trackerClient.getConnection();
if (trackerServer == null) {
System.out.println("getConnection return null");
return;
}
//获取一个storage server
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
if (storageServer == null) {
System.out.println("getStoreStorage return null");
}
//定义StorageClient,用于请求storage server
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
FileInfo fileInfo = storageClient.query_file_info("group1",
"M00/00/00/wKgrAl3CKQ2AdFzHAAMLFm7ARCE630.jpg");
System.out.println(fileInfo);
}
//下载文件
@Test
public void testDownloadFile() throws IOException, MyException {
//加载fastdfs‐client.properties配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
//定义TrackerClient,用于请求TrackerServer
TrackerClient trackerClient = new TrackerClient();
//连接tracker Server
TrackerServer trackerServer = trackerClient.getConnection();
if (trackerServer == null) {
System.out.println("getConnection return null");
return;
}
//获取一个storage server
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
if (storageServer == null) {
System.out.println("getStoreStorage return null");
}
//定义StorageClient1,用于请求storage server
StorageClient1 storageClient1 = new StorageClient1(trackerServer, storageServer);
//根据文件id下载文件
byte[] result = storageClient1.download_file1("group1/M00/00/00/wKgrAl3CIluAG3syAAMLFm7ARCE883.jpg");
File file = new File("d:/1.png");
//使用输出流保存文件
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(result);
fileOutputStream.close();
}
}
后话:写了很久,希望能帮到有需要的人,如果发现有什么错误或者有什么遗漏的地方,希望指正一下。谢谢!