1 FastDFS 安装
所用文件下载 提取码:v9w5
1.1 安装虚拟机
安装 CentOS7 虚拟机。
1.2 FastDFS–tracker 安装
分别在 192.168.101.3 和 192.168.101.4 上安装 tracker。
注:初次安装可只安装一台 tracker即192.168.101.3, 快速体验。
1.2.1 下载
tracker 和 storage 使 用 相 同 的 安 装 包 ,下载地址
本教程使用: FastDFS_v5.05.tar.gz
1.2.2 FastDFS 安装环境
FastDFS 是 C 语言开发,建议在 linux 上运行,本教程使用 Centos7 作为安
装环境。
安装 FastDFS 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果
没有 gcc 环境,需要安装 gcc:yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
1.2.3 安装 libevent
FastDFS 依赖 libevent 库,需要安装:
yum -y install libevent
1.2.4 安装 libfastcommon
libfastcommon 是 FastDFS 官方提供的, libfastcommon 包含了 FastDFS 运行所需要的一些基础库。将 libfastcommonV1.0.7.tar.gz
拷贝至/usr/local/下
cd /usr/local
tar -zxvf libfastcommonV1.0.7.tar.gz
cd libfastcommon-1.0.7
./make.sh
./make.sh install
注意: libfastcommon 安装好后会自动将库文件拷贝至/usr/lib64 下, 由于 FastDFS 程序引用 usr/lib 目录所以需要将/usr/lib64 下的库文件(如下所示)拷贝至/usr/lib 下。
cp /usr/lib64/libfastcommon.so /usr/lib
1.2.5 tracker 编译安装
将 FastDFS_v5.05.tar.gz 拷贝至/usr/local/下
tar -zxvf FastDFS_v5.05.tar.gz
cd FastDFS
./make.sh 编译
./make.sh install 安装
安装成功将安装目录下的 conf 下的文件拷贝到/etc/fdfs/下。
cp -r /usr/local/FastDFS/conf/. /etc/fdfs
1.2.6 配置
安装成功后进入/etc/fdfs 目录:
拷贝一份新的 tracker 配置文件:
cp tracker.conf.sample tracker.conf
修改 tracker.conf
vi tracker.conf
base_path=/home/yuqing/FastDFS 改为:base_path=/home/FastDFS
配置 http 端口:http.server_port=80
配置完后要手动创建目录/home/FastDFS,否则启动时会报错
1.2.7 启动
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
1.3 FastDFS–storage 安装
分别在 192.168.101.5、 192.168.101.6、 192.168.101.7、 192.168.101.8 上安装 storage。
注:初次安装可只安装一台 storage即192.168.101.5,快速体验。
1.3.1 安装 libevent
同 tracker 安装,克隆虚拟机可直接跳过
1.3.2 安装 libfastcommon
同 tracker 安装,克隆虚拟机可直接跳过
1.3.3 storage 编译安装
同 tracker 编译安装,克隆虚拟机可直接跳过
1.3.4 配置
安装成功后进入/etc/fdfs 目录:
拷贝一份新的 storage 配置文件:
cp storage.conf.sample storage.conf
修改 storage.conf
vi 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.101.3:22122 #配置 tracker 服务器:IP
#如果有多个则配置多个 tracker
tracker_server=192.168.101.4:22122
#配置 http 端口
http.server_port=80
配置完后依然手动创建上面的目录 /home/fastdfs 和 /home/fastdfs/fdfs_storage
1.3.5 启动
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
1.4 上传图片测试
1.4.1 通过 fdfs_test 程序
测试前可以直接将防火墙关闭
关闭防火墙:systemctl stop firewalld.service
禁止防火墙开机自启:systemctl disable firewalld.service
FastDFS 安装成功可通过/usr/bin/fdfs_test 程序来测试上传、下载等操作。
修改/etc/fdfs/client.conf
tracker_server 根据自己部署虚拟机的情况配置 。
base_path=/home/fastdfs
tracker_server=192.168.101.3:22122
tracker_server=192.168.101.4:22122
使用格式:
/usr/bin/fdfs_test 客户端配置文件地址 upload 上传文件
比如将/home 下的图片上传到 FastDFS 中:
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/gfd.jpg
打印如下日志:
其中最后一行的example file url就是文件的下载路径,但由于现在还没有和 nginx 整合无法使用 http 下载。
1.5 FastDFS 和 nginx 整合
1.5.1 nginx 代理
单独安装 nginx 代理服务,它的作用是代理访问 storage 上的文件,实现负载均衡。nginx 的安装细节参考 nginx 文档,这里使用单机 nginx,也可以使用两台 nginx 组成高可用或者采用 lvs+nginx 访问 Storage 上的 nginx。
1.5.2 在 Storage 上安装 nginx
在 storage server 上安装 nginx 的目的是对外通过 http 访问 storage server 上的文
件。使用 nginx 的模块 FastDFS-nginx-module 的作用是通过 http 方式访问 storage 中的文件,当 storage 本机没有要找的文件时向源 storage 主机代理请求文件。
1.5.2.1 FastDFS-nginx-module
将 FastDFS-nginx-module_v1.16.tar.gz 传 至 fastDFS 的 storage 服 务 器 的
/usr/local/下,执行如下命令:
cd /usr/local
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module/src
修改 config 文件将/usr/local/路径改为/usr/
将 FastDFS-nginx-module/src 下的 mod_FastDFS.conf 拷贝至/etc/fdfs/下
cp mod_fastdfs.conf /etc/fdfs/
并修改 mod_fastdfs.conf 的内容:
vi /etc/fdfs/mod_fastdfs.conf
base_path=/home/fastdfs
tracker_server=192.168.101.3:22122
tracker_server=192.168.101.4:22122
url_have_group_name=true #url 中包含 group 名称
store_path0=/home/fastdfs/fdfs_storage #指定文件存储路径
#如果有多个
将 libfdfsclient.so 拷贝至/usr/lib 下
cp /usr/lib64/libfdfsclient.so /usr/lib
/
创建 nginx/client 目录
mkdir -p /var/temp/nginx/client
1.5.2.2 nginx 安装
将 nginx-1.15.6.tar.gz 拷贝到/usr/local 下
解压 nginx-1.15.6.tar.gz:tar -zxvf nginx-1.15.6.tar.gz
安装必备库
yum install –y pcre-devel
yum install –y zlib-devel
yum install –y openssl-devel
进入 nginx-1.15.6目录,执行如下配置命令:
其中第二行表示本人要安装的位置
最后一行表示添加 FastDFS-nginx-module 模块
./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=/usr/local/fastdfs-nginx-module/src
创建临时目录
mkdir /var/temp/nginx -p
安装
make && make install
查看已经安装的模块
/usr/local/nginx/sbin/nginx -V
1.5.2.3 修改nginx 配置文件并启动
server {
listen 80;
server_name 192.168.101.5;
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
启动Storage上的nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
如果遇到以下错误,新建/var/run/nginx/ 目录即可
启动后即可通过url直接进行访问
1.5.3 测试
测试将在SpringBoot工程中进行,代码编写可以参考FastDFS java client SDK
所包含的倚赖如下:
<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>
在/resources/config/ 下新建 fastdfs-client.properties
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.tracker_servers = 192.168.101.3:22122
上传和下载的测试代码如下:
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");
//定义TrackerClient,用于请求TrackerServer
TrackerClient trackerClient = new TrackerClient();
//连接tracker
TrackerServer trackerServer = trackerClient.getConnection();
//获取Stroage
StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
//创建stroageClient
StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
//向stroage服务器上传文件
//本地文件的路径
String filePath = "C:\\Users\\Administrator\\Pictures\\gfd.jpg";
//上传成功后拿到文件Id
String fileId = storageClient1.upload_file1(filePath, "jpg", null);
System.out.println(fileId);
//group1/M00/00/01/wKhlQVuhU3eADb4pAAAawU0ID2Q159.png
} catch (Exception e) {
e.printStackTrace();
}
}
//下载文件
@Test
public void testDownload(){
try {
//加载fastdfs-client.properties配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
//定义TrackerClient,用于请求TrackerServer
TrackerClient trackerClient = new TrackerClient();
//连接tracker
TrackerServer trackerServer = trackerClient.getConnection();
//获取Stroage
StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
//创建stroageClient
StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
//下载文件
//文件id
String fileId = "group1/M00/00/00/wKhlBV4lcHqAUFywAAN2APkLUOc789.jpg";
byte[] bytes = storageClient1.download_file1(fileId);
//使用输出流保存文件
FileOutputStream fileOutputStream = new FileOutputStream(new File("D:/logo.jpg"));
fileOutputStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
}
}