MinIO(文件共享,对比NFS),web集群共享网页案例
MinIO 完整部署流程(RHEL 9.3)
1. 安装依赖
dnf install -y wget
2. 下载 MinIO 服务端
全球网站
https://min.io/
https://min.io/
国内网站
MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容
https://minio.org.cn/download.shtml#/linux
老网址可能用不了
MinIO Downloads
https://dl.min.io/server/minio/release/linux-amd64
wget https://dl.min.io/server/minio/release/linux-amd64/minio -O /usr/local/bin/minio
chmod +x /usr/local/bin/minio
注意这里下载的不是软件包
3. 创建数据目录和minio用户
[root@ha01 ~]# useradd -r -s /sbin/nologin minio-user
-r= 创建 系统用户(system user)
不是给人登录用的
给服务、程序用的
UID 比较小(系统预留)
生产环境标准规范
-s /sbin/nologin= 禁止这个用户登录系统
任何人无法用这个用户远程登录
无法切换到它
极大提高安全性
这是企业运行服务的标准安全做法
mkdir -p /data/minio
chown -R minio-user:minio-user /data/minio
4. 放行防火墙端口
firewall-cmd --permanent --add-port=9000/tcp
firewall-cmd --permanent --add-port=9001/tcp
firewall-cmd --reload
9000:MinIO S3 数据端口(程序上传下载、API 通信用)
9001:MinIO Web 控制台端口(你浏览器登录管理用)
5. 创建 systemd 服务
dl.minio.io/aistor/minio/minio.service
https://dl.minio.io/aistor/minio/minio.service
官方文档
cat > /etc/systemd/system/minio.service <<EOF
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
Type=notify
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
ProtectProc=invisible
EnvironmentFile=-/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=1048576
# Turn-off memory accounting by systemd, which is buggy.
MemoryAccounting=no
# Specifies the maximum number of threads this process can create
TasksMax=infinity
# Disable timeout logic and wait until process is stopped
TimeoutSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
# Built for ${project.name}-${project.version} (${project.name})
EOF
逐段逐行解释
[Unit]
Description=MinIO # 服务名字(随便写)
Documentation=https://docs.min.io # 官方文档地址
Wants=network-online.target # 依赖网络
After=network-online.target # 等网络启动后再启动 MinIO
AssertFileIsExecutable=/usr/local/bin/minio # 检查 minio 文件是否存在,不存在就启动失败
- 这段是服务说明 + 启动依赖
- 必须等网络通了才启动
- 检查文件是否存在,避免启动失败
[Service]
Type=notify # 告诉系统 MinIO 启动成功了(官方标准)
WorkingDirectory=/usr/local # 工作目录(固定)
User=minio-user # 使用普通用户 minio-user 运行(生产安全!不用 root)
Group=minio-user
ProtectProc=invisible # 安全加固:其他用户看不到进程
重点:企业生产绝对不能用 root 跑服务,这是安全规范
EnvironmentFile=-/etc/default/minio
- 从
/etc/default/minio读取配置 - 账号、密码、端口、数据目录都放这里
- 解耦配置,方便维护
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
- 真正启动 MinIO 的命令
$MINIO_OPTS= 端口等参数$MINIO_VOLUMES= 数据目录- 命令从环境变量读取,灵活、标准
Restart=always # 服务挂了自动重启(生产必备)
LimitNOFILE=1048576 # 最大文件打开数(高并发必备)
TasksMax=infinity # 不限制线程数
TimeoutSec=infinity # 不强制杀进程(防止数据损坏)
SendSIGKILL=no # 温柔关闭,不暴力kill(保护数据)
MemoryAccounting=no # 关闭系统内存统计(避免bug)
写配置文件
cat > /etc/default/minio <<EOF
MINIO_VOLUMES="/data/minio"
MINIO_OPTS="--address :9000 --console-address :9001"
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=12345678
EOF
逐行解释你写的内容
MINIO_VOLUMES="/data/minio"
→ 数据存在哪里
相当于告诉 MinIO:
你的文件、图片、备份都保存在 /data/minio 目录
MINIO_OPTS="--address :9000 --console-address :9001"
→ 启动端口
9000 = 文件传输端口
9001 = 网页管理端口
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=12345678
→ 登录网页的账号密码
你浏览器登录 http://IP:9001 用的就是这个。
6. 启动并开机自启
systemctl daemon-reload
systemctl enable --now minio
systemctl status minio
看到 active (running) 就是成功。
访问 Web 界面(文件共享)
在浏览器打开:
http://你的虚拟机IP:9001
账号:admin
密码:12345678
功能:
- 创建 Bucket(共享空间)
- 上传 / 下载文件
- 生成共享链接
- 权限管理
- 完全替代 NFS 做文件共享
如何使用web界面以及查看文件内容
在web界面上传文件,在这个界面可以将资源下载下来查看。
上传资源后查看虚拟机文件里是否出现相应目录

如果出现这种情况可能是没开utf-8,用locale去检查,如果正常可以重启虚拟机。
命令行客户端 mc(换一台虚拟机)
wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc
chmod +x /usr/local/bin/mc
配置连接:
mc alias set minio-ha minio http://192.168.24.100:9000 admin 12345678
mc= MinIO 官方客户端工具(用来连接、管理、上传下载文件)
alias= 给远程服务器起个别名,方便以后快速连接
(就像给联系人起备注,不用每次输 IP)
set= 添加、设置
minio-ha= 你给远程 MinIO 服务器起的别名
随便起名,比如 minio-ha、oss、storage 都行
http://192.168.24.100:9000= MinIO 服务器的地址 + API 端口
192.168.24.100 = ha01 真实 IP
9000 = 数据通信端口(程序用)
admin= MinIO 用户名(你自己配置的)
12345678= MinIO 密码(你自己配置的)
查询所有的bucket,和指定bucket里面的文件
[root@nfs ~]# mc ls minio-ha/studytxt
[2026-03-29 14:49:34 CST] 3.4KiB STANDARD 初始化.txt
[root@web02 html]# mc ls minio-ha
[2026-04-11 17:37:26 CST] 0B onebucket/
[2026-03-29 14:41:33 CST] 0B studytxt/

相匹配
注意:
常用操作:
mc ls minio # 查看存储桶
mc cp 文件名 minio/test # 上传文件
mc share download minio/test/文件名 # 生成共享链接
举例实操:
[root@nfs ~]# mc alias set minio-ha http://192.168.24.100:9000 admin 12345678
Added `minio-ha` successfully.
[root@nfs ~]# mc ls minio-ha/studytxt
[2026-03-29 14:49:34 CST] 3.4KiB STANDARD 初始化.txt
mc cat minio-ha/studytxt/初始化.txt
这样就能看见里面的内容
下载到本地
mc cp minio-ha/studytxt/初始化.txt /data
Web 集群 + MinIO 共享存储完整笔记
场景:1 台 MinIO 存储 + 2 台 Web 服务器,实现所有网页文件统一存储、实时同步、集群共享,替代 NFS。环境说明
- MinIO 服务器:
192.168.24.100 - Web 服务器 1:
web01 - Web 服务器 2:
web02 - MinIO 桶名:
studytxt - 账号:
admin/ 密码:12345678 - 网站根目录:
/var/www/html
一、MinIO 服务器端操作(192.168.24.100)
1. 确认 MinIO 正常运行
# 查看 MinIO 服务状态
systemctl status minio
说明:确保状态为 active (running),服务正常。
2. 放行防火墙端口(9000 给客户端用)
# 永久开放 9000 API 端口
firewall-cmd --permanent --add-port=9000/tcp
# 重载防火墙
firewall-cmd --reload
说明:允许 Web 机器访问 MinIO 存储接口。
3. 上传测试网页到 MinIO
# 新建测试首页
echo "<h1>Hello MinIO Web Cluster</h1>" > index.html
# 上传到 MinIO 的 studytxt 桶
mc cp index.html myminio/studytxt/
[root@ha01 ~]# mc cp /index.html minio-one/studytxt/
/index.html: 32 B / 32 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 6.62 KiB/s 0s[root@ha01 ~]# cd /data/minio/
[root@ha01 minio]# ls
studytxt
[root@ha01 minio]# cd studytxt/
[root@ha01 studytxt]# ls
index.html 初始化.txt
说明:文件上传后,两台 Web 服务器都能实时读到。
二、两台 Web 服务器通用配置(web01 /web02 都执行)
1. 安装 EPEL 源(s3fs 必须)
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
阿里云镜像
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
说明:RHEL 官方仓库没有 s3fs,必须装 EPEL。
2. 安装 s3fs(挂载 MinIO 用)
dnf install -y s3fs-fuse
说明:s3fs 可以把 S3/MinIO 桶 “挂载” 成本地目录。
3. 配置 MinIO 认证信息
# 写入账号密码到认证文件
echo "admin:12345678" > /etc/passwd-s3fs
# 加固权限(必须 600)
chmod 600 /etc/passwd-s3fs
仅允许文件所有者读写,其他任何用户都无任何权限,保障敏感信息安全
说明:权限不对会挂载失败。
4. 创建网站根目录(也可以直接用默认/usr/share/nginx/html)
mkdir -p /var/www/html
5. 挂载 MinIO 桶到网页目录
s3fs studytxt /usr/share/nginx/html \
-o url=http://192.168.24.100:9000 \
-o allow_other \
-o use_path_request_style \
-o uid=990 \
-o gid=990 \
-o umask=000
-o是必须要的
-o allow_other
允许非 root 用户访问挂载目录
nginx、apache 必须要这个参数,否则无权读网页
-o use_path_request_style
MinIO 必须加这个参数
告诉 s3fs 使用兼容模式访问 MinIO
注意:
uid和gid要写nginx用户和组的
[root@web01 ~]# id nginx
uid=990(nginx) gid=990(nginx) groups=990(nginx)
如果你不写这两行,挂载后是root,nginx运行是nginx用户和用户组,会导致403,没有权限
注意:
如果挂载有问题,只要你一执行 df、ls、cd 这类命令,都会无限等待,看起来像卡死。
s3fs 是网络挂载,依赖 MinIO 服务器响应
一旦:
MinIO 挂了
网络不通
防火墙拦截
延迟太高
系统去问 s3fs:“你多大容量?”
s3fs 一直等 MinIO 回复 → 命令卡死不动
umount -l /usr/share/nginx/html
-l = 懒惰卸载,不管是否 busy 直接断开
6. 验证挂载是否成功
df -h
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 955M 0 955M 0% /dev/shm
tmpfs 382M 5.6M 377M 2% /run
/dev/mapper/rhel-root 17G 1.5G 15G 10% /
/dev/nvme0n1p2 960M 217M 744M 23% /boot
/dev/nvme0n1p1 599M 7.0M 592M 2% /boot/efi
/dev/sr0 9.9G 9.9G 0 100% /mnt
tmpfs 191M 0 191M 0% /run/user/0
s3fs 64P 0 64P 0% /usr/share/nginx/html
说明:看到 s3fs 挂载到 /var/www/html 即成功。
7. 测试网页是否一致
[root@web01 ~]# curl localhost
192.168.24.100 172.17.0.1 ha01
说明:两台 Web 看到的内容完全一样,实现共享。
另一台可以自己配置nginx配置文件,将家目录改为/var/www/html
[root@web02 html]# cat /etc/nginx/conf.d/web.conf
server {
listen 8080;
server_name www.web.com;
root /var/www/html;
index index.html;
}
[root@web02 html]# curl localhost:8080
192.168.24.100 172.17.0.1 ha01
三、实现 “实时更新” 效果(任意一台操作即可)
在 MinIO 服务器更新文件
[root@ha01 /]# echo "hellow world" > index.html
[root@ha01 /]# mc cp /index.html minio-one/studytxt
/index.html: 13 B / 13 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 1.56 KiB/s 0s
两台 Web 服务器立即查看
[root@web02 html]# curl localhost:8080
hellow world
[root@web01 ~]# curl localhost
hellow world
结果:两台 Web 同时更新,无需同步、无需重启。
四、设置开机自动挂载(生产必须)
两台 Web 都执行:
echo "s3fs#studytxt /usr/share/nginx/html fuse _netdev,allow_other,use_path_request_style,url=http://192.168.24.100:9000,uid=$(id -u nginx),gid=$(id -g nginx),umask=000 0 0" >> /etc/fstab
1. s3fs#studytxt
s3fs#:固定开头,告诉系统这是 s3fs 挂载
studytxt:MinIO 桶名(你要挂载的存储)
2. /usr/share/nginx/html
挂载到本地的路径
这是 Nginx 真正的网页目录
所以网页能直接读取 MinIO 里面的文件
3. fuse
文件系统类型:s3fs 属于 fuse 设备
4. _netdev
最重要参数之一:
告诉系统:这是网络存储,开机等网络通了再挂载
不加会开机卡很久、挂载失败
mount -a
说明:重启服务器后自动挂载,不会丢共享。
五、整体架构总结
MinIO (192.168.24.100)
↓ 共享存储
web01 web02
/usr/share/nginx/html /var/www/html
一、为什么现在 Web 集群、云环境都用 MinIO,不用 NFS?
1. MinIO 是对象存储,天生适合云原生、分布式、高并发
- 无单点瓶颈(可以集群、多副本、分布式扩展)
- 无限扩容,存储空间想加就加
- 高可用:挂一台不影响整体
- 适合图片、视频、静态资源、备份、上传文件
你可以把对象存储理解成:
一个巨大的、网络版的 “文件保险柜”
你存进去的每个文件 = 一个 对象(Object)
每个文件有一个唯一的名字(key)
没有文件夹层级、没有目录树、没有文件锁、没有 chmod、没有软链接
只支持 4 个操作:上传、下载、删除、列表
就像:
你把文件扔进去,给它一个名字;
要用的时候,通过名字取回来。
对比:
NFS 是文件夹共享(有目录、有路径、能实时修改)
MinIO/S3 是文件保险柜(只存文件,不搞复杂文件操作)
为什么 Web 集群喜欢它?
多台服务器都能通过 HTTP 上传 / 下载
不存在 “同时写一个文件冲突”
可以无限扩容
挂一台服务器不影响整体
2. NFS 是文件共享,本质是单点目录共享
- 一台 NFS 挂了,整个集群全部瘫痪(一般是单点)
- 并发高了性能直线下降
- 不能跨机房、不能分布式
- 扩容极其麻烦
3. 权限 & 安全天差地别
- MinIO:有 AK/SK 密钥、细粒度权限、签名 URL、审计日志
- NFS:靠 IP 白名单 + 目录权限,非常粗糙,不安全
4. 容器 & K8s 环境首选 MinIO
- NFS 在容器里经常权限乱套、延迟高、稳定性差
- MinIO 有标准 S3 接口,所有语言都有 SDK,非常友好
5. 性能模型不同
- NFS:实时强依赖网络,延迟敏感,一卡全卡
- MinIO:基于 HTTP,重试、分片、缓存友好,更稳定
二、NFS 明明是内核级别,为什么反而 “不好用”?
内核级 ≠ 更好,只代表 “在内核里跑”
NFS 内核级带来的缺点远大于优点:
- 一旦卡死,整个系统文件操作卡死df、ls、cd、rm 全卡住,只能重启
- 内核级故障 = 系统级故障NFS 宕机或网络抖动 → 直接引发应用卡死
- 并发能力弱内核设计年代早,不适应现代高并发 Web 集群
- 扩展性几乎为零不能分布式、不能多活、不能跨域
- 权限模型太简单不适合多租户、多项目、多业务线
NFS 内核级 = 更依赖网络、更不稳定、更难排错
三、MinIO + Web 集群?
因为这是现代企业标准架构:
- 静态页面、图片、附件、用户上传 → 全部放 MinIO
- Web 集群多台机器共享同一份资源
- 改一次,全站生效
- 高可用、可扩展、安全、易运维
- 符合云原生、微服务、容器化趋势
而 NFS 已经逐渐退出核心 Web 集群架构。
四、NFS 现在什么情况下才会用?
NFS 并没有死,但场景非常固定:
1. 小企业单服务器简单共享
- 几台机器共享配置、脚本、小文件
- 没有高并发、没有高可用要求
2. VMware / 虚拟化环境共享存储
- 虚拟机磁盘、模板共享
- 传统 IT 基础架构仍大量使用
这种情况最适合,因为虚拟机本身就是一堆文件
复制虚拟机
移动虚拟机
备份虚拟机
批量删除
挂载 ISO 这些情况minio做不了
因为 MinIO 是对象存储:
没有文件夹结构
没有文件锁 ------虚拟机跑系统时,会经常锁定文件,防止多个程序同时写一个文件导致损坏
不能随机修改文件 -----MinIO 的机制是:要改文件 = 全部重新上传一遍 不能随时改
不能挂成系统盘 ------MinIO 是 HTTP 上传下载,根本不是块设备 / 文件系统,不能分区,格式化,随机读写,交换分区等等
延迟高 -----系统盘对延迟非常敏感。
不支持热迁移 ----新主机看不到磁盘, 磁盘不一致, 直接宕机
虚拟机跑在 MinIO 上 = 直接蓝屏 / 死机。
3. 老旧系统、传统应用不支持对象存储
- 老 PHP、老 Java 项目写死本地路径
- 只能用 NFS 硬挂
4. 内部小文件共享、非核心业务
- 日志临时归集
- 内部配置分发
- 低压力、低访问量
5. Linux 集群之间简单目录同步需求
- 不需要高可用
- 低成本、快速搭建
更多推荐


所有评论(0)