LOADING
1618 字
8 分钟
用openlist+S3搭建负载均衡文件存储
2026-08-24

起因

阿里云ESA的流量非常吓人,超量之后要将近两毛钱1GB,因此我用目前手上的几台机器做了负载分流图床,分离网站中的大文件,刷新网站再也不心疼了。这篇文章讲解一下我捣鼓下来的心得

用户先请求负载均衡节点,节点重定向到空闲的机器返回用户,看下来OpenList非常符合我的需求

食用提示:本文偏教程向!

介绍

OpenList 中有多种负载均衡架构,可以根据需求参考文档选择。本文就以 多源读取负载均衡 为例

文档原文:

“多源读取负载均衡可以将文件的副本分散在若干不同的存储服务上,当用户访问文件时,系统会随机选择其中一个文件返回,从而降低单个存储服务的上行带宽压力(类似于 RAID 1)”

用户上传时,文件副本会上传到每个节点;拉取时302重定向到随机资源节点,提供用户下载

简单来说就是下面的架构

用户
访问文件资源
按负载返回资源URL
Openlist负载均衡节点
存储服务
存储服务
存储服务
存储API
存储API
存储API

存储子节点只需要部署 OpenList 支持的存储服务即可。WebDAV 、 FTP/SFTP 、S3 以及各种网盘都可以,这里就用 MinIO 简单部署一个S3服务作为演示


正文

部署MinIO S3子节点

需要考虑一下数据放在哪个路径,建议单独挂载数据分区,最好不要和系统在一个分区,不然可能和系统殉爆。这里就不多说了

Terminal window
lsblk #列出所有可用块

返回例

Terminal window
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 1G 0 part /boot/efi
└─sda2 8:2 0 118.2G 0 part /
sdb 8:0 0 465.8G 0 disk
├─sdb1 8:1 0 300M 0 part
├─sdb2 8:2 0 16M 0 part
└─sdb3 8:3 0 465.5G 0 part /mnt/hdd

上面的案例就是一块 sda 系统盘,一块 sdb 数据盘: 挂载在 /mnt/hdd

接下来用Docker部署minio

  • 准备数据路径
Terminal window
sudo mkdir -p /mnt/hdd/minioData #这里换成你的路径
  • 运行容器
Terminal window
sudo docker run -d \
--name minio \
--restart unless-stopped \
-p 9000:9000 \
-p 9001:9001 \
-e MINIO_ROOT_USER='账号' \
-e MINIO_ROOT_PASSWORD='密码' \
-v /mnt/hdd/minioData:/minioData \
minio/minio server /minioData --console-address ":9001"

没docker自己下一个,拉取minio镜像需要魔法,或者用代理站

-p 端口推荐换别的,默认的 9001 是管理面板, 9000 是S3 API

  • 进入 服务器IP:9001,输入刚刚的账户密码,进去后点击 Create Bucket 创建一个桶,然后记下存储桶名称

一个子节点就部署好了,方便吧 =)。

后续中心节点可以使用 MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 连接S3 API,也可以自己用MinIO CLI创建访问子用户秘钥ID和安全访问秘钥,可控制权限

也可以用MinIO CLI纯命令行创建桶,点我空投,这里不再赘述


部署Openlist分流节点

连接到待部署机,安装Openlist使用从文档获取的一键脚本,直接丢进去即可

Terminal window
curl -fsSL https://res.oplist.org.cn/script/v4.sh > install-openlist-v4.sh && sudo bash install-openlist-v4.sh

按照指引安装,国内机最好加上代理 如 https://gh-proxy.com/

安装好之后打开Openlist后台,默认是 服务器ip:5244


配置负载均衡

Openlist管理面板打开之后,点左侧栏 存储 -> 添加 -> 对象存储驱动 -> 添加

  • 根文件夹路径 : 给挂载文件夹取一个名字,推荐地区命名,如 /HangZhou#1

  • 存储桶 : MiniIO的存储桶名称

  • 端点 : 默认是 http://服务器ip:9000

  • 访问密钥 ID : MiniIO的用户名

  • 访问密钥 : MiniIO的密码

然后打开强制路径样式,最下方添加即可,然后去测试一下文件上传下载

以上是单个存储节点的添加方式,添加完所有节点进行下一步


一样是刚刚添加驱动的地方,这次点击并添加 别名

  • 挂载路径 : 选一个喜欢的,如 /SharkcatFileHub

  • 路径 : "merge:" 加上每个节点的路径,如 merge:/HangZhou#1

  • 读取冲突策略 和 上传冲突策略 就是负载均衡策略,可参考openlist文档,正常按照下图填写即可

别名

点击确认,然后就大功告成了!

往别名文件夹里上传测试文件,可正常打开,且随机返回地址

done

平时使用上传到别名文件夹,右键复制直链使用即可


接下来是收尾工作

1

往节点文件夹单独上传文件不会同步,平时用不上子节点的话隐藏子节点文件夹即可

去管理界面,设置 -> 全局 -> 隐藏文件(在第一项)

添加 /\/节点路径名/i

`/\/HangZhou#1/i`
`/\/节点路径名B/i`
`/\/节点路径名C/i`

然后保存即可,隐藏后只是前端不显示,不会影响功能


MiniO命令行配置

MiniO CLI可以方便的配置所有S3服务远程节点,本机节点等,先下载并添加权限

Terminal window
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc

最好配置一个别名,要不然会很麻烦

Terminal window
mc alias set <别名> http://服务器ip:9000 <管理员用户名> <管理员密码>

本机填127就可以,类似如下

Terminal window
mc alias set my-tong http://127.0.0.1:9000 admin admin123

创建一个桶

Terminal window
mc mb <别名>/my-bucket #my-bucket桶名

创建用户,<ACCESS_ID> 和 <SECRET_KEY> 就是这个用户用于访问 S3 API 的凭据

Terminal window
mc admin user add <别名> <ACCESS_ID> <SECRET_KEY>

给予该用户权限,例如读写权限

Terminal window
mc admin policy attach <别名> readwrite --user <ACCESS_ID>

readwrite 读写权限

readonly 只读权限


MiniO配置SSL证书

差点忘了还要配置https,创建一个目录把证书放进去,然后docker加挂载启动即可

例如把 private.key 和 public.crt 放在 /mnt/hdd/minioCerts

Terminal window
chmod 600 /mnt/hdd/minioCerts/private.key
chmod 644 /mnt/hdd/minioCerts/public.crt
docker run -d \
--name minio \
--restart unless-stopped \
-p 9000:9000 \
-p 9001:9001 \
-e MINIO_ROOT_USER='账号' \
-e MINIO_ROOT_PASSWORD='密码' \
-v /mnt/hdd/minioData:/minioData \
-v /mnt/hdd/minioCerts:/root/.minio/certs:ro \
minio/minio server /minioData \
--console-address ":9001"

加 :ro 只读


关于文件同步

多源读取负载均衡 只有经过别名文件夹的上传、读写、修改才会同步至所有节点,对单节点的操作不会同步

假如 节点A 有某个文件 ,节点B 没有,此时openlist只会选择 节点A 的URL返回。前提是该文件是通过别名文件夹上传的

如果需要增加节点,只需要将别名文件夹中的所有资源复制到目标存储(在Openlist Web UI中),然后添加进别名文件夹就可以


终于byd写完了

用openlist+S3搭建负载均衡文件存储
https://sharkcat.xin/posts/openlist/main/
作者
sharkcat
发布于
2026-08-24
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

服务状态
100% uptime
100% uptime
100% uptime
100% uptime
目录
文章
分类
标签
目录