赞
踩
环境介绍:
两台真实的ubuntu22系统的服务器:192.168.116.130、192.168.116.132
sudo apt-get update
sudo apt-get -y install git gcc g++ make automake autoconf libtool pcre2-utils libpcre2-dev zlib1g zlib1g-dev openssl libssh-dev wget vim
mkdir /home/fastdfs/
# FastDFS下载
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
# Nginx fastdfs插件包下载
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
# FastDFS依赖源码下载
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
# Nginx包下载
wget -c https://nginx.org/download/nginx-1.12.1.tar.gz
# 1.进入/home/fastdfs/目录
cd /home/fastdfs/
# 2.解压
tar -zxvf V1.0.7.tar.gz
# 3.进入解压后目录
cd libfastcommon-1.0.7
# 4.编译
./make.sh
# 5.安装
./make.sh install
# libfastcommon.so 默认安装目录为 /usr/lib64/libfastcommon.so,由于后续FastDFS主程序设置的lib目录是/usr/local/lib,所以这里需要创建软链接
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
# 1.进入/home/fastdfs/目录
cd /home/fastdfs/
# 2.解压
tar -zxvf fastdfs-5.05.tar.gz
# 3.进入解压后目录
cd fastdfs-5.05
# 4.编译
./make.sh
# 5.安装
./make.sh install
# fastdfs服务脚本,配置文件所在路径
etc/
├── init.d/ # 服务脚本所在路径
│ ├── fdfs_storaged
│ └── fdfs_tracker
│
└── fdfs/ # 配置文件(样例模板)所在路径
├── client.conf.sample
├── storage.conf.sample
└── tracker.conf.sample
# FastDFS 服务脚本 bin 目录是 /usr/local/bin, 但实际命令安装在 /usr/bin/ 下。我们需要建立 /usr/bin 到 /usr/local/bin 的软链接
ln -s /usr/bin/fdfs_trackerd /usr/local/bin
ln -s /usr/bin/fdfs_storaged /usr/local/bin
ln -s /usr/bin/stop.sh /usr/local/bin
ln -s /usr/bin/restart.sh /usr/local/bin
cd /etc/fdfs/
cp tracker.conf.sample tracker.conf
vim tracker.conf
# 修改如下内容
# 绑定该主机的地址
bind_addr=192.168.116.132
#tracker存储数据和日志根路径
base_path=/home/fastdfs/tracker
#http端口(需要和nginx配置相同)
http.server_port=80
#保存退出
:wq
#创建tracker存储数据和日志目录(base_path对应的目录)
mkdir /home/fastdfs/tracker
# 1.启动 tracker(初次启动会在 base_path 路径下自动创建data、logs目录)
/etc/init.d/fdfs_trackerd start
# 查看进程
ss -untlp | grep fdfs
常用启停命令
# 启动tracker服务
/etc/init.d/fdfs_trackerd start
# 重启动tracker服务
/etc/init.d/fdfs_trackerd restart
# 停止tracker服务
/etc/init.d/fdfs_trackerd stop
# 自启动tracker服务
chkconfig fdfs_trackerd on
这里简单的认识下base_path目录下data,logs结构:
base_path/
├── data/ # tracker数据存储目录
│ ├── fdfs_trackerd.pid # 记录程序运行的pid
│ ├── storage_changelog.dat # 记录更新的stroage情况
│ ├── storage_groups.dat # 存储分组信息
│ └── storage_servers.dat # 存储服务器(storage)列表
│
└── logs/ # 配置文件(样例模板)所在路径
└── trackerd.log # 日志文件,记录启动停止等信息
# 进入 fastdfs 的服务脚本目录
cd /etc/fdfs
# 复制 fastdfs 存储器样例配置文件 storage.conf.sample,并重命名为 storage.conf
cp storage.conf.sample storage.conf
# 编辑配置 storage.conf
vim storage.conf
# 配置文件是否不生效,false 为生效
disabled=false
# 指定此 storage server 所在 组(卷)
group_name=group1
# storage server 服务端口
port=23000
# 绑定该主机的地址
bind_addr=192.168.116.132
# 修改以下配置(包括注释掉配置)tracker_server配置为你安装的tracker服务所在ip。其它保持默认,保存退出
base_path=/home/fastdfs/storage
#store_path0=/home/yuqing/fastdfs
# 有多个 tracker server 时,每个 tracker server 写一行
tracker_server=192.168.116.132:22122
http.server_port=80
# 保存并退出
:wq
# 创建storage存储数据和日志目录(base_path对应的目录)
mkdir -p /home/fastdfs/storage
# 1.启动 storage(初次启动会在 base_path 路径下自动创建data、logs目录)
/etc/init.d/fdfs_storaged start
# 2.查看 storage是否启动成功,23000端口正在被监听,则storage服务安装成功
ss -unltp|grep fdfs
# 3.查看 storage 是否和 tracker在通信
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
storage服务常用命令
# 启动storage服务
/etc/init.d/fdfs_storaged start
# 重启动storage服务
/etc/init.d/fdfs_storaged restart
# 停止storage服务
/etc/init.d/fdfs_storaged stop
# 自启动storage服务
chkconfig fdfs_storaged on
# 进入 fastdfs 的服务脚本目录
cd /etc/fdfs
# 复制 client 样例配置文件 client.conf.sample,并重命名为 client.conf
cp client.conf.sample client.conf
# 编辑配置 client.conf
vi client.conf
# 修改以下配置(包括注释掉配置)tracker_server配置为你安装的tracker服务所在ip。其它保持默认,保存退出
base_path=/home/fastdfs/client
tracker_server=192.168.116.132:22122
:wq
# 创建client存储数据和日志目录(base_path对应的目录)
mkdir -p /home/fastdfs/client
# tracker.conf测试文件
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf tracker.conf
# 文件id由 group+存储目录+两级子目录+文件名+文件后缀名构成
group1/M00/00/00/wKh0hGYrauuAUZtUAAAbzCiYtn808.conf
# 1.进入usr/local/src目录
cd /usr/local/src
# 2.解压
tar -zxvf nginx-1.12.1.tar.gz
# 3.进入解压后目录
cd nginx-1.12.1
# 4.使用默认配置
./configure
# 5.编译
make
# 6.安装
make install
./configure: error: the HTTP rewrite module requires the PCRE library.
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
缺少依赖
sudo apt-get install libpcre3 libpcre3-dev
重新配置
./configure
.....
creating objs/Makefile
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
src/core/ngx_murmurhash.c:37:11: error: this statement may fall through [-Werror=implicit-fallthrough=]
src/core/ngx_murmurhash.c:37:11: error: this statement may fall through [-Werror=implicit-fallthrough=]
37 | h ^= data[2] << 16;
| ~~^~~~~~~~~~~~~~~~
src/core/ngx_murmurhash.c:38:5: note: here
38 | case 2:
| ^~~~
src/core/ngx_murmurhash.c:39:11: error: this statement may fall through [-Werror=implicit-fallthrough=]
39 | h ^= data[1] << 8;
| ~~^~~~~~~~~~~~~~~
src/core/ngx_murmurhash.c:40:5: note: here
40 | case 1:
| ^~~~
cc1: all warnings being treated as errors
make[1]: *** [objs/Makefile:462: objs/src/core/ngx_murmurhash.o] Error 1
make[1]: Leaving directory '/home/fastdfs/nginx-1.12.1'
make: *** [Makefile:8: build] Error 2
# 进入Makefile文件
vim /home/fastdfs/nginx-1.12.1/objs/Makefile
# 找到
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g
# 改为(删除-Werror )
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g
# 保存
:wq
重新编译
# 回到nginx目录
cd /home/fastdfs/nginx-1.12.1
# 再次编译
make
error: ‘struct crypt_data’ has no member named ‘current_salt’
src/os/unix/ngx_user.c: In function ‘ngx_libc_crypt’:
src/os/unix/ngx_user.c:36:7: error: ‘struct crypt_data’ has no member named ‘current_salt’
36 | cd.current_salt[0] = ~salt[0];
| ^
make[1]: *** [objs/Makefile:777: objs/src/os/unix/ngx_user.o] Error 1
make[1]: Leaving directory '/home/fastdfs/nginx-1.12.1'
make: *** [Makefile:8: build] Error 2
# nginx安装包目录下编辑以下文件
vim src/os/unix/ngx_user.c
#注释掉第36行的
/*cd.current_salt[0] = ~salt[0];*/
# 保存
:wq
重新编译
# 回到nginx目录
cd /home/fastdfs/nginx-1.12.1
# 再次编译
make
# 安装
make install
编译安装成功
# 1.进入安装目录
cd /usr/local/nginx/sbin/
# 2.启动 nginx
./nginx
# 3.查看nginx版本信息(确认是否启动成功)
/usr/local/nginx/sbin/nginx -V
nginx服务常用命令
# 停止nginx服务(快速关闭,不管有没有正在处理的请求)
/usr/local/nginx/sbin/nginx -s stop
# 退出nginx服务(在退出前完成已经接受的连接请求)
/usr/local/nginx/sbin/nginx -s quit
# 重启nginx服务
/usr/local/nginx/sbin/nginx -s reload
# 查看日志
tail -200f /usr/local/nginx/logs/error.log
# 1.修改nginx.conf配置
vi /usr/local/nginx/conf/nginx.conf
# 添加以下配置:
location ~ /group[1-9]/M0[0-9] {
alias /home/fastdfs/storage/data;
}
# 重启nginx
/usr/local/nginx/sbin/nginx -s reload
浏览器访问:
http://192.168.116.130:22122/group1/M00/00/00/wKh0gmYrGvyABEhiAAAFuK5MMV842.conf
单节点部署完成
解决当在集群模式下,如果在给192.168.116.130上传文件时,这个时候192.168.116.132,在没有完全同步完成这个文件的情况下,通过192.168.116.132来访问这个文件,此时就会报错,这个时候fastdfs-nginx-module插件就会重定向文件链接到源服务器取文件,避免客户端由于同步复制延迟导致的文件无法访问的问题。
# 进入cd /home/fastdfs/目录
cd /home/fastdfs/
# 解压
unzip fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
# 重命名(名字太长改短一点)
mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module
# 先停止nginx服务
/usr/local/nginx/sbin/nginx -s stop
# 进入nginx解压包目录
cd /home/fastdfs/nginx-1.12.1
# 添加插件
./configure --add-module=/home/fastdfs/fastdfs-nginx-module/src
# 重新编译和安装(编译之前一定要先处理前面 “2.2.1、make编译过程中遇到的报错”,提到的报错)
make && make install
# 查看Nginx的版本模块(用来确认插件添加是否成功)有如下图表示插件安装成功
/usr/local/nginx/sbin/nginx -V
# 进入 fastdfs-nginx-module/src 源码目录
cd /home/fastdfs/fastdfs-nginx-module/src/
# 复制 fastdfs-nginx-module 源码中的配置文件到 /etc/fdfs 目录
cp mod_fastdfs.conf /etc/fdfs/
# 进入/etc/fdfs/
cd /etc/fdfs/
# 编辑mod_fastdfs.conf
vim mod_fastdfs.conf
# 连接超时时间
connect_timeout=10
# Tracker Server
tracker_server=192.168.116.132:22122
# 如果文件ID的uri中包含/group**,则要设置为true
url_have_group_name = true
# Storage 配置的store_path0路径,必须和storage.conf中的一致
store_path0= /home/fastdfs/storage
# 放开http配置文件(额外加的配置)
include http.conf
http.mime_types_filename=/usr/local/nginx/conf/mime.types
http.default_content_type=application/octet-stream
# 保存
:wq
# 进入fastdfs配置文件目录
cd /home/fastdfs/fastdfs-5.05/conf/
# 拷贝配置文件到 /etc/fdfs 目录
cp anti-steal.jpg http.conf mime.types /etc/fdfs/
# 修改nginx.conf 配置,在80端口监听下添加fastdfs-nginx 插件配置(修改匹配路径为 /group1/M00/00 ,以及增加配置 ngx_fastdfs_module),其他默认
vi /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx
会出现:ngx_http_fastdfs_set pid=
就利用conf目录下的anti-steal.jpg文件测试
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf anti-steal.jpg
访问试试
http://192.168.116.132/group1/M00/00/00/wKh0hGYrfH-AJ6FrAABdrZgsqUU138.jpg
# 1. 停止 tracker
/etc/init.d/fdfs_trackerd stop
# 2. 停止storage
/etc/init.d/fdfs_storaged stop
# 3. 停止nginx
/usr/local/nginx/sbin/nginx -s stop
(1)Tracker Server:跟踪服务器。主要起到负载均衡和调度作用。在客户端上传文件时通过策略找到storage server提供上传服务。每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
(2)Storage Server:存储服务器。主要提供容量和备份服务。以 group 为单位,每个 group 内可以有多个 storage server,数据互为备份。
(3)Client:客户端。通过接口,使用 TCP/IP 协议与跟踪器服务器或存储节点进行数据交互。
只有一台Tracker ,来进行负载均衡和调度,将集群内其他的Tracker Server的ip和端口都指向那一台Tracker。
比如案例中:有两台192.168.116.130:22122和192.168.116.132:22122
# 1. 启动 tracker
/etc/init.d/fdfs_trackerd start
# 2. 启动 storage
/etc/init.d/fdfs_storaged start
# 3. 启动 nginx
/usr/local/nginx/sbin/nginx
# 2. 启动 storage
/etc/init.d/fdfs_storaged start
配置很简单,简单来说就是在每台服务的mod_fastdfs.conf和storage.conf这两个文件中配置多个tracker_server;
tracker_server=192.168.116.132:22122
tracker_server=192.168.116.130:22122
# 1. 启动 tracker
/etc/init.d/fdfs_trackerd start
# 2. 启动 storage
/etc/init.d/fdfs_storaged start
# 3. 启动 nginx
/usr/local/nginx/sbin/nginx
4.验证
(1)在任意一台服务上上传文件“/usr/bin/fdfs_upload_file /etc/fdfs/client.conf xxx.jpg”,然后查看其他服务器上“/home/fastdfs/storage/data/00/00”中是否有该文件。
(2)宕机刚才上传文件的storage服务,看是否还能正常访问;
(3)宕机其中一台的Tracker服务,看是否还能正常访问;
版本
spring boot:2.5.6
fastdfs-client:1.27.2
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
fdfs:
so-timeout: 2000 # 读取时间
connect-timeout: 1000 # 连接超时时间
thumb-image: # 生成缩略图
height: 150 # 缩略图高度
width: 150 # 缩略图宽度
tracker-list: # tracker 服务器地址,这里是数组类型,可以配置多台
- 192.168.116.130:22122
- 192.168.116.132:22122
# 这里可以在开一个nginx服务将两台fastdfs的nginx做一次负载均衡代理出来,我这里直接配置fastdfs的nginx了
web-server-url: http://192.168.116.130:80
pool: # 可参考 ConnectionPoolConfig
#从池中借出的对象的最大数目(配置为-1表示不限制)
max-total: -1
#获取连接时的最大等待毫秒数(默认配置为5秒)
max-wait-millis: 5000
#每个key最大连接数 key配置的是连接服务端的地址(IP+端口)连接情况,如果有连接不够用的情况可以调整以上参数
max-total-per-key: 50
#每个key对应的连接池最大空闲连接数
max-idle-per-key: 10
#每个key对应的连接池最小空闲连接数
min-idle-per-key: 5
#向调用者输出“连接”资源时,是否检测有效性
test-on-borrow: true
@Autowired
private FastFileStorageClient storageClient;
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) throws IOException {
try {
// 上传文件,返回文件存储路径(组名和文件名)
StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(),
FilenameUtils.getExtension(file.getOriginalFilename()), null);
return "文件上传成功,路径:" + storePath.getGroup() + "/" + storePath.getPath();
} catch (Exception e) {
e.printStackTrace();
return "文件上传失败:" + e.getMessage();
}
}
@Autowired
private FastDFSDownload fastDFSDownload;
@GetMapping("/download/{filePath}")
public void downloadFile(@PathVariable("filePath") String filePath, HttpServletResponse response) throws IOException {
filePath = "group1/M00/00/00/"+filePath;
String group = filePath.substring(0, filePath.indexOf("/"));
String path = filePath.substring(filePath.indexOf("/") + 1);
/*
//能不通过这种方式获取文件名,不然会有报错:错误码:2,错误信息:找不到节点或文件
Set<MetaData> metadata = fastFileStorageClient.getMetadata(group, path);
String fileName = metadata.iterator().next().getValue();
*/
byte[] bytes = fastFileStorageClient.downloadFile(group, path, new DownloadByteArray());
response.setContentType("application/octet-stream");
try {
//指定文件名,以及文件名的字符集
//response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, Charsets.UTF_8.displayName()));
IOUtils.write(bytes,response.getOutputStream());
}catch (Exception e){
e.printStackTrace();
}
}
上传测试:
下载测试:http://127.0.0.1:6030/test/download/wKh0gmYrq9eAKTHeAAhWFGy5AHg614.png
搞定
nginx配置:
http{
upstream storage_servers {
server 192.168.116.130:80;
server 192.168.116.132:80;
}
server {
listen 8080;
server_name localhost;
location ~ /group[1-9]/M0[0-9] {
proxy_pass http://storage_servers;
}
}
这里上面的spring boot中的web-server-url就可以配置为:
web-server-url: http://:8080
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。