ubuntu22 部署fastDFS单节点和集群,整合Spring Boot(刚部署成功)

ubuntu22 部署fastDFS单节点和集群

  • 一、先准备
    • 1、所需依赖安装
    • 2、下载安装包
  • 二、安装FastDFS单节点
    • 1、libfastcommon安装
      • 1.1、创建软连接
    • 2、安装fastDFS
      • 2.1、fastDFS目录简单介绍
      • 2.2、创建软连接
    • 3、配置和启动Tracker服务
      • 3.1、修改Tracker配置文件
      • 3.2、启动Tracker
    • 4、配置和启动Storage服务
      • 4.1、修改配置
      • 4.2、启动Storage
    • 5、客户端上传文件
      • 5.1、配置Client
      • 5.2、上传文件测试
  • 三、安装Nginx
    • 1、解压 -> 编译 -> 安装
    • 2、遇到的报错异常
      • 2.1.1、checking配置文件报错
      • 2.1.2、解决办法
      • 2.2.1、make编译过程中遇到的报错
      • 2.2.2、解决办法
      • 2.3.1、make编译过程中遇到的报错(可能会遇到)
      • 2.3.2、解决办法
    • 3、启动Nginx
      • 3.1、配置nginx的配置文件,用于访问文件
      • 3.2、测试文件访问
  • 四、集群部署
    • 1、安装Nginx的fastdfs-nginx-module插件
      • 1.1、插件作用:
      • 1.2、解压 -> 编译 -> 安装插件
      • 1.3、修改配置文件
      • 1.4、修改Nginx配置文件
      • 1.5、启动nginx
      • 1.6、文件测试
    • 2、准备工作
    • 3、fastDFS构成:
    • 4、集群模式
      • 4.1、Storage 集群
      • 4.1、Tracker集群
  • 五、整合Spring boot
    • 1、导入fastdfs-client依赖
    • 2、application.yml中配置fdfs
    • 3、测试的API接口
      • 再开一台nginx服务器,将两台fastdfs的nginx的80端口代理出来

环境介绍:
两台真实的ubuntu22系统的服务器:192.168.116.130、192.168.116.132

一、先准备

1、所需依赖安装

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

2、下载安装包

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

在这里插入图片描述

二、安装FastDFS单节点

1、libfastcommon安装

# 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

在这里插入图片描述

1.1、创建软连接

# 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

在这里插入图片描述

2、安装fastDFS

# 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

在这里插入图片描述

2.1、fastDFS目录简单介绍

#  fastdfs服务脚本,配置文件所在路径
etc/
├── init.d/  # 服务脚本所在路径
│  ├── fdfs_storaged
│  └── fdfs_tracker
│
└── fdfs/   # 配置文件(样例模板)所在路径
   ├── client.conf.sample
   ├── storage.conf.sample
   └── tracker.conf.sample

2.2、创建软连接

# 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

在这里插入图片描述

3、配置和启动Tracker服务

3.1、修改Tracker配置文件

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

3.2、启动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 # 日志文件,记录启动停止等信息

4、配置和启动Storage服务

4.1、修改配置

# 进入 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

4.2、启动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

5、客户端上传文件

5.1、配置Client

# 进入 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

5.2、上传文件测试

# tracker.conf测试文件
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf tracker.conf
# 文件id由 group+存储目录+两级子目录+文件名+文件后缀名构成
group1/M00/00/00/wKh0hGYrauuAUZtUAAAbzCiYtn808.conf

在这里插入图片描述

三、安装Nginx

1、解压 -> 编译 -> 安装

# 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

2、遇到的报错异常

2.1.1、checking配置文件报错

./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.

在这里插入图片描述

2.1.2、解决办法

缺少依赖

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"

2.2.1、make编译过程中遇到的报错

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

在这里插入图片描述

2.2.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

2.3.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

2.3.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

编译安装成功
在这里插入图片描述

3、启动Nginx

# 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

3.1、配置nginx的配置文件,用于访问文件

# 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

3.2、测试文件访问

浏览器访问:

http://192.168.116.130:22122/group1/M00/00/00/wKh0gmYrGvyABEhiAAAFuK5MMV842.conf
在这里插入图片描述

单节点部署完成

四、集群部署

1、安装Nginx的fastdfs-nginx-module插件

1.1、插件作用:

解决当在集群模式下,如果在给192.168.116.130上传文件时,这个时候192.168.116.132,在没有完全同步完成这个文件的情况下,通过192.168.116.132来访问这个文件,此时就会报错,这个时候fastdfs-nginx-module插件就会重定向文件链接到源服务器取文件,避免客户端由于同步复制延迟导致的文件无法访问的问题。

1.2、解压 -> 编译 -> 安装插件

# 进入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

在这里插入图片描述

1.3、修改配置文件

# 进入 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

1.4、修改Nginx配置文件

# 进入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

在这里插入图片描述

1.5、启动nginx

/usr/local/nginx/sbin/nginx

会出现:ngx_http_fastdfs_set pid=
在这里插入图片描述

1.6、文件测试

就利用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
在这里插入图片描述

2、准备工作

  1. 按照上面的方式将集群内其他服务器的fastdfs单节点以及nginx和插件搭建完成。
  2. 关闭所有的Tracker 、Storage 、nginx服务
    # 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
    

3、fastDFS构成:

(1)Tracker Server:跟踪服务器。主要起到负载均衡和调度作用。在客户端上传文件时通过策略找到storage server提供上传服务。每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
(2)Storage Server:存储服务器。主要提供容量和备份服务。以 group 为单位,每个 group 内可以有多个 storage server,数据互为备份。
(3)Client:客户端。通过接口,使用 TCP/IP 协议与跟踪器服务器或存储节点进行数据交互。

4、集群模式

4.1、Storage 集群

只有一台Tracker ,来进行负载均衡和调度,将集群内其他的Tracker Server的ip和端口都指向那一台Tracker。
比如案例中:有两台192.168.116.130:22122和192.168.116.132:22122

  1. 将192.168.116.130:22122作为Tracker 服务器,由于192.168.116.130中mod_fastdfs.conf和storage.conf中配置的Tracker 服务器本身就是192.168.116.130:22122;
  2. 所以只需要将192.168.116.132中mod_fastdfs.conf和storage.conf两个配置文件中原本的:“tracker_server=192.168.116.132:22122”改为“tracker_server=192.168.116.130:22122”;
    在这里插入图片描述
  3. 启动 192.168.116.130上面的三个服务
    	# 1. 启动 tracker
    	/etc/init.d/fdfs_trackerd start
    	# 2. 启动 storage
    	/etc/init.d/fdfs_storaged start
    	# 3. 启动 nginx
    	/usr/local/nginx/sbin/nginx
    
  4. 启动 192.168.116.116 机器上的 storage 服务
    # 2. 启动 storage
    /etc/init.d/fdfs_storaged start
    

4.1、Tracker集群

配置很简单,简单来说就是在每台服务的mod_fastdfs.conf和storage.conf这两个文件中配置多个tracker_server;

  1. 停止所有服务器的Tracker 、Storage 、nginx服务
  2. 分别进入 192.168.116.130 与 192.168.116.132 两台机器上 /etc/fdfs/ 目录下的两个配置文件,逐一的在配置文件中并列配置两条 tracker_server 如下:
    tracker_server=192.168.116.132:22122
    tracker_server=192.168.116.130:22122
    
    在这里插入图片描述
  3. 启动每台服务器的Tracker 、Storage 、nginx
    	# 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

版本

spring boot:2.5.6
fastdfs-client:1.27.2

1、导入fastdfs-client依赖

<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.27.2</version>
</dependency>

2、application.yml中配置fdfs

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

3、测试的API接口

    @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服务器,将两台fastdfs的nginx的80端口代理出来

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/584443.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字节码插桩 -- 入门篇

背景 我们先了解下什么情况下会用到字节码插桩。学技术并不是为了秀技术&#xff0c;而是为了解决业务问题。 我们先想象一个业务场景— 我们需要统计耗时方法&#xff0c;这时&#xff0c;我们会怎么做&#xff1f; 在每个方法开头和结尾处分别记录开始时间与结束时间&…

学生管理系统[Python语言]

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 学生管理系统是计算机专业最基础的一个作业&#…

高扬程水泵,提升水源新选择!— 恒峰智慧科技

在炎炎夏日&#xff0c;阳光炙烤着大地&#xff0c;森林火灾的发生频率也随之上升。火势猛烈&#xff0c;烟雾弥漫&#xff0c;给森林带来了极大的破坏。为了保护森林资源&#xff0c;我们必须采取有效的措施来扑灭火灾。而在这其中&#xff0c;高扬程水泵成为了提升水源新选择…

智慧旅游驱动行业革新:智能技术引领服务全面升级,匠心打造高品质、个性化旅游新体验

一、引言 随着科技的飞速发展和信息化程度的不断提高&#xff0c;智慧旅游正逐渐成为旅游业发展的新趋势。智慧旅游&#xff0c;顾名思义&#xff0c;是以智能化技术为支撑&#xff0c;通过大数据、云计算、物联网、人工智能等先进技术的应用&#xff0c;实现旅游服务的全面升…

Java项目:基于SSM框架实现的实践项目管理系统(ssm+B/S架构+源码+数据库+毕业论文+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的实践项目管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff…

BIMBase浏览器新功能——碰撞检测

BIMBase浏览器&#xff08;原BIMBase建模软件 Lite&#xff09;全新R1.14版本已经全面上线&#xff0c;新版本下载链接&#xff1a;BIMBase浏览器R1.14。本次给大家介绍一下本次版本的重点功能&#xff1a;碰撞检测。 各位设计院/施工单位/运维单位的伙伴们在模型交付、方案讨论…

第三节课,功能2:开发后端用户的管理接口5min(用户的查询/状态更改)【4】【9开始--本人】

一、代码任务 【录个屏】 二、写代码 2.1 代码文件位置 2.2 代码如下&#xff1a; 2.3 官方文档&#xff1a; 网址&#xff1a; 逻辑删除 | MyBatis-Plus (baomidou.com) 三、代码有bug&#xff0c;没有鉴权&#xff0c;表里添加一个字段。role 管理员 3.1 判断操作的人&am…

【开发工具】pythontutor——在线内存可视化工具

笔者在学习RISC-V时&#xff0c;希望找到一款可视化的内存工具&#xff0c;遗憾目前还未找到。发现了pythontutor这个网站&#xff0c;可以对C、python等多种语言进行内存可视化。结果似乎是x86架构的&#xff0c;符合小端存储。 贴一下网址&#xff0c;原准备依据开源版本进行…

什么是MOM?为什么它是趋势

制造运营管理&#xff08;MOM&#xff09; 制造运营管理&#xff08;MOM&#xff09;旨在优化制造流程的效率和有效性。它涵盖制造执行、质量管理、生产计划和调度以及制造智能等功能。这种解决方案以全面的方式管理和增强制造流程。 MOM的功能特点 对于MOM的功能特点来说&…

爬虫自动调用shell通过脚本运行scrapy爬虫(crawler API)

一、爬虫时如何同时调用shell 1)终端cd项目>>scrapy crawl example 2)打开example.py import scrapy from scrapy.shell import inspect_response#引入shellclass ExampleSpider(scrapy.Spider):name "example"allowed_domains ["example.com"]…

兄弟们,哪一家做智慧校园的公司比较靠谱?

开发技术参数 1、使用springboot框架Javavue2 2、数据库MySQL5.7 3、移动端小程序使用小程序原生语言开发 4、电子班牌固件安卓7.1&#xff1b;使用Java Android原生 5、elmentui &#xff0c;Quartz&#xff0c;jpa&#xff0c;jwt 6、SaaS云平台&#xff0c;私有云部署…

iview 自定义项求和的方法和错误点

这是iview自定义某几项参数合计的方法&#xff0c;其实是蛮简单的&#xff0c;很多人自定义合计的时候&#xff0c;老是会不知道怎么处理除了需要合计的几项的其他项&#xff0c;其实不需要管&#xff0c;不需要合计的项直接返回空就好了&#xff0c;需要的就在计算的里面做key…

Llama 3 ——开源大模型Llama 3从概念到使用

概述 Meta公司自豪地宣布推出其最新的开源大型语言模型——Llama 3&#xff0c;这是一款专为未来AI挑战而设计的先进工具。Llama 3包含两个不同参数规模的版本&#xff0c;以满足多样化的计算需求&#xff1a; 8B版本&#xff1a;优化了在消费级GPU上的部署和开发流程&#xf…

初识MVC

初识MVC 理论部分 今天第一次学MVC&#xff0c;拿到一个练手项目。现在来记录一下学习过程。 项目的背景就是个学生管理系统。我只做后端。 从大的来说MVC将应用程序分为三个主要组件&#xff08;部分&#xff09;&#xff1a; 模型&#xff08;Model&#xff09;是应用程序…

SGP.31-05

6.1.1 eIM触发下载过程 6.1.2 eIM Initiated Direct Profile Download with SM-DS 在文档的“6.1.2 eIM 发起的通过 SM-DS 的直接配置文件下载”部分&#xff0c;描述了两种直接从 SM-DP 到 eUICC 的配置文件下载选项。以下是每个步骤的概述&#xff1a; ### 开始条件&…

​基于Python的在线自主评测系统(django)​

基于Python的在线自主评测系统(django) 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 学生功能模块的实现 学生注册的实现 学生登录界面首页 在线考试界面 考试成绩查看界面 教师功能模块的实现 新建…

以全栈智算拥抱生态,为AIGC种一棵向上生长的巨榕

榕树&#xff0c;被称为百木之王。它既有极深的根&#xff0c;又有繁茂的叶。只要一棵榕树长成&#xff0c;就能够独木成林&#xff0c;遮天蔽日。更可贵的是&#xff0c;榕树可以为树荫下繁茂的生态提供支撑&#xff0c;形成“一榕生&#xff0c;万物长”的格局。 开年以来&am…

MySQL中SELECT语句的执行过程

2.1.1. 一条SELECT语句的执行过程 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层 Server层负责建立连接、分析和执行SQL存储引擎层负责数据的存储和提取&#xff0c;支持 InnoDB、MyISAM、Memory 等多个存储引擎&#xff0c;MySQL5.5以后默认使用InnoDB&#xff0…

set_input_delay的理解

1&#xff0c;set_input_delay约束理解 input_delay是指输入的数据到达FPGA的pad引脚时相对于时钟边沿的延迟有多大&#xff0c;单位是ns&#xff0c;数值可以是正&#xff0c;也可以是负。通过set_input_delay约束告诉编译器输入时钟和输入数据的相位关系。如下图所示假设时钟…

RSA加密---java和node兼容版(可直接复制使用)

目录 背景 实现 一、node代码 1、引入依赖 2、生成公钥和私钥 3、生成工具类 二、java代码 背景 本来项目的后端是node&#xff0c;里面登录接口用的是后端生成RSA公钥和私钥&#xff0c;公钥给前端网页用来加密&#xff0c;node后端解密&#xff0c;一切很和谐&#x…