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 Downloadshttps://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.servicehttps://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 内核级带来的缺点远大于优点

  1. 一旦卡死,整个系统文件操作卡死df、ls、cd、rm 全卡住,只能重启
  2. 内核级故障 = 系统级故障NFS 宕机或网络抖动 → 直接引发应用卡死
  3. 并发能力弱内核设计年代早,不适应现代高并发 Web 集群
  4. 扩展性几乎为零不能分布式、不能多活、不能跨域
  5. 权限模型太简单不适合多租户、多项目、多业务线

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 集群之间简单目录同步需求

  • 不需要高可用
  • 低成本、快速搭建
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐