FastDFS 的安装、使用 【CentOS】
图片上传功能使用 FastDFS,图片上传成功之后,接下来的图片访问我们一般采用 Nginx,所以需要安装三个软件包。
- Tracker 安装
- Storage 安装
- Nginx 安装
下载FastDFS及其他其他依赖库
提前下载需要的依赖库,上传到服务器/usr/local目录下备用
官网下载地址:
https://sourceforge.net/projects/fastdfs/files/
https://github.com/happyfish100/libfastcommon1.FastDFS压缩包,本文作者使用版本为 fastdfs-6.06.tar.gz
2.libfastcommon库,本文作者使用版本为 libfastcommon-1.0.43.tar.gz
3.fastdfs-nginx-module库 ,本文作者使用版本为 fastdfs-nginx-module-1.22.tar.gz
Tracker 安装
FastDFS 依赖于C语言,因此需要安装gcc环境。
yum install gcc-c++
FastDFS还依赖于libevent 库以及FastDFS官方提供的libfastcommon库,需要从官网下载libfastcommon库。
安装libevent 库
yum -y install libevent
安装libfastcommon库
//将下载好的libfastcommon库压缩包拷贝至/usr/local下,
// 进入目录中
cd /usr/local
// 对其解压
tar -zxvf libfastcommon-1.0.43.tar.gz
// 解压完进入文件夹中
cd libfastcommon-1.0.43
// 编译安装
./make.sh
./make.sh install
安装FastDFS
#解压FastDFS压缩包后进入目录
cd /usr/local
tar -zxvf fastdfs-6.06.tar.gz
cd fastdfs-6.06
#编译安装
./make.sh
./make.sh install
#将安装目录内 conf 目录下的配置文件拷贝到 /etc/fdfs目录下
cd conf/
cp ./* /etc/fdfs/
#进入 /etc/fdfs/ 目录下,vim打开 tracker.conf 文件
cd /etc/fdfs/
vim tracker.conf
#找到并修改以下属性: #默认端口 port=22122 #元数据存储路径,注意更改用户名、目录要存在 base_path=/home/muxinna/fastdfs
启动Tracker
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
Storage 安装
Storage 本身的安装和 Tracker 一致,命令基本一样,因为这里我将 Tracker 和 Storage 安装再同一台服务器上,所以不用再执行安装命令了(相当于安装了 Tracker 时已经安装了 Storage 了)。
如果你是配置单个服务器那么现在唯一要做的,就是进入到 /etc/fdfs 目录下,配置 Storage:
cd /etc/fdfs/
vim storage.conf
#找到并修改以下属性: #修改自己的元数据路径,注意与之前配置一致 base_path=/home/muxinna/fastdfs store_path0=/home/muxinna/fastdfs #更改虚拟机/服务器 ip:port tracker_server=192.168.202.133:22122
配置完成后,再次启动 Storage:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
Java本地客户端测试服务器软件环境:
新建Maven工程:
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
新建FastDFS 的配置文件 fastdfs-client.properties
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
#暂时不使用FastDFS认证
fastdfs.http_anti_steal_token = false
#FastDFS认证秘钥,可自定义
fastdfs.http_secret_key = FastDFS123
fastdfs.http_tracker_http_port = 80
#Tracker服务器配置ip:port
fastdfs.tracker_servers = 192.168.202.133:22122
fastdfs.connection_pool.enabled = true
fastdfs.connection_pool.max_count_per_entry = 500
fastdfs.connection_pool.max_idle_time = 3600
fastdfs.connection_pool.max_wait_time_in_ms = 1000
新建Test.java
//最后调用 client 的 upload_file1 方法上传文件,第一个参数是文件路径,第二个参数是文件的扩展名,第三个参数是文件的元数据信息,这个方法的返回值,就是上传文件的访问路径,执行该方法
@Test
void contextLoads() throws IOException, MyException {
//加载配置文件
ClientGlobal.initByProperties("fastdfs-client.properties");
//构造一个 TrackerClient 对象,接着再跟据这个对象获取到一个 TrackerServer,然后再创建一个 StorageClient1 实例。
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer storageServer = null;
StorageClient1 client1 = new StorageClient1(trackerServer, storageServer);
//NameValuePair 中保存的就是文件的元数据信息,如果有的话,就以 key/value 的方式来设置,如果没有直接给一个 null 即可。
NameValuePair pairs[] = null;
//调用 client 的 upload_file1 方法上传文件
//第一个参数是文件路径,第二个参数是文件的扩展名,第三个参数是文件的元数据信息,这个方法的返回值,就是上传文件的访问路径
String fileId = client1.upload_file1("D:test.jpg", "jpg", pairs);
System.out.println(fileId);
}
会生成以下打印日志即为上传成功:
group1/M00/00/00/wKj9gh6dokqASBDQATNK8J10-TU753.jpg
Nginx配置FastDFS
- 这时我们就可以通过安装 Nginx 来完成访问图片的功能:
- Nginx 的安装分为两个步骤:
- 安装 Nginx
- 在 Storage 下安装 fastdfs-nginx-module
下载 Nginx:
wget http://nginx.org/download/nginx-1.17.0.tar.gz
解压下载的目录,进入解压目录中,注意记住解压目录位置,后面还会需要。
在编译安装之前,需要安装两个依赖,并编译安装
#下载依赖
yum -y install pcre-devel
yum -y install openssl openssl-devel
#进入Nginx解压目录,省略
#编译安装
./configure
make
make install
#装好之后,默认安装位置:/usr/local/nginx/sbin/nginx
安装fastdfs-nginx-module:
cd /usr/local
tar -zxvf fastdfs-nginx-module-1.22.tar.gz
将 /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf 文件拷贝到 /etc/fdfs 目录下,并修改文件配置:
cp /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf
#修改ip:port tracker_server=192.168.202.133:22122 url_hava_group_name=true #注意与之前路径保持一致 store_path0=/home/muxinna/fastdfs
回到 nginx 安装文件的解压目录中,重新配置编译安装:
./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src
make
make install
修改Nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
#更改为root user root; worker _processes 1 ; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server{ listen 80; server_name localhost; #新加内容 location ~/group([0-9]) { root /home/muxinna/fastdfs/data; ngx_fastdfs_module; } }
启动Nginx:
#首先进入 nginx 的目录中去
cd /usr/local/nginx/sbin/
#启动 nginx
./nginx
#启动成功后的打印日志
ngx_http_fastdfs_set pid=20771
此时在浏览器中输入http://192.168.202.133/group1/M00/00/00/wKj9gh6dokqASBDQATNK8J10-TU753.jpg就可以看到上传的图片了。
如果访问http://192.168.202.133能够正常出现Nginx启动页,但是图片无法访问,显示404,以下为解决措施:
-
/etc/fdfs/storage.conf中http.server_port与/usr/local/nginx/conf/nginx.conf中的listen端口号一致,storage.conf中默认的端口是8888,nginx.conf中listen端口为80,建议更改storage.conf中默认的端口
-
若修改为8888端口需要对8888端口开启防火墙,或者关闭服务器防火墙
-
nginx.conf 第一行 user nobody 修改为 user root 。
-
保存,重启nginx服务 /usr/local/nginx/sbin/nginx -s reload
-
检查是否开启22122端口,或者关闭服务器防火墙
Java客户端文件下载
//调用 download_file1 方法获取到一个 byte 数组,然后通过IO 流写出到本地文件
@Test
void download() throws IOException, MyException {
ClientGlobal.initByProperties("fastdfs-client.properties");
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer storageServer = null;
StorageClient1 client1 = new StorageClient1(trackerServer, storageServer);
byte[] bytes = client1.download_file1("group1/M00/00/00/wKj9gh6dokqASBDQATNK8J10-TU753.jpg");
FileOutputStream fos = new FileOutputStream(new File("D:\\2.jpg"));
fos.write(bytes);
fos.close();
}
FastDFS令牌验证
此时任何用户都可以直接访问到我们服务器上的文件,极不安全,可以在上传时加上令牌验证。
服务器开启令牌校验:
vim /etc/fdfs/http.conf
#开启令牌校验 http.anti_steal.check_token=true #与Java客户端秘钥配置一致 http.anti_steal.secret_key=Fast123
重启Nginx
/usr/local/nginx/sbin/nginx -s reload
Java客户端携带令牌访问
@Test
void getToken() throws UnsupportedEncodingException, NoSuchAlgorithmException, MyException {
int ts = (int) Instant.now().getEpochSecond();
String token = ProtoCommon.getToken(
"M00/00/00/wKj9gF6dkA-AeHQ1AAAT8J10-TU507.jpg",
ts,
"FastDFS123"
);
StringBuilder sb = new StringBuilder();
sb.append("http://192.168.202.133")
.append("/group1/M00/00/00/wKj9gF6dkA-AeHQ1AAAT8J10-TU507.jpg")
.append("?token=")
.append(token)
.append("&ts=")
.append(ts);
System.out.println(sb.toString());
}
跟据 ProtoCommon.getToken 方法来获取令牌,
- 第一个参数就是你要访问的文件 id,地址内不要包含 group。
- 第二个参数是时间戳。
- 第三个参数是密钥,密钥要和服务端的配置一致。
运行此方法,访问了控制台输出路径,如果此时将路径中的 token去掉,就会访问失败,默认展示的就是 Nginx 的默认404页面。