MinIO(文件共享,对比NFS),web集群共享网页案例

MinIO(文件共享,对比NFS),web集群共享网页案例 MinIO 完整部署流程RHEL 9.31. 安装依赖dnf install -y wget2. 下载 MinIO 服务端MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容wget https://dl.min.io/server/minio/release/linux-amd64/minio -O /usr/local/bin/minio chmod x /usr/local/bin/minio注意这里下载的不是软件包3. 创建数据目录和minio用户[rootha01 ~]# 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/minio4. 放行防火墙端口firewall-cmd --permanent --add-port9000/tcp firewall-cmd --permanent --add-port9001/tcp firewall-cmd --reload 9000MinIO S3 数据端口程序上传下载、API 通信用 9001MinIO Web 控制台端口你浏览器登录管理用5. 创建 systemd 服务dl.minio.io/aistor/minio/minio.service官方文档cat /etc/systemd/system/minio.service EOF [Unit] DescriptionMinIO Documentationhttps://docs.min.io Wantsnetwork-online.target Afternetwork-online.target AssertFileIsExecutable/usr/local/bin/minio [Service] Typenotify WorkingDirectory/usr/local Userminio-user Groupminio-user ProtectProcinvisible EnvironmentFile-/etc/default/minio ExecStart/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES # Let systemd restart this service always Restartalways # Specifies the maximum file descriptor number that can be opened by this process LimitNOFILE1048576 # Turn-off memory accounting by systemd, which is buggy. MemoryAccountingno # Specifies the maximum number of threads this process can create TasksMaxinfinity # Disable timeout logic and wait until process is stopped TimeoutSecinfinity SendSIGKILLno [Install] WantedBymulti-user.target # Built for ${project.name}-${project.version} (${project.name}) EOF逐段逐行解释[Unit] DescriptionMinIO # 服务名字随便写 Documentationhttps://docs.min.io # 官方文档地址 Wantsnetwork-online.target # 依赖网络 Afternetwork-online.target # 等网络启动后再启动 MinIO AssertFileIsExecutable/usr/local/bin/minio # 检查 minio 文件是否存在不存在就启动失败这段是服务说明 启动依赖必须等网络通了才启动检查文件是否存在避免启动失败[Service] Typenotify # 告诉系统 MinIO 启动成功了官方标准 WorkingDirectory/usr/local # 工作目录固定Userminio-user # 使用普通用户 minio-user 运行生产安全不用 root Groupminio-user ProtectProcinvisible # 安全加固其他用户看不到进程重点企业生产绝对不能用 root 跑服务这是安全规范EnvironmentFile-/etc/default/minio从/etc/default/minio读取配置账号、密码、端口、数据目录都放这里解耦配置方便维护ExecStart/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES真正启动 MinIO 的命令$MINIO_OPTS 端口等参数$MINIO_VOLUMES 数据目录命令从环境变量读取灵活、标准Restartalways # 服务挂了自动重启生产必备 LimitNOFILE1048576 # 最大文件打开数高并发必备 TasksMaxinfinity # 不限制线程数 TimeoutSecinfinity # 不强制杀进程防止数据损坏 SendSIGKILLno # 温柔关闭不暴力kill保护数据 MemoryAccountingno # 关闭系统内存统计避免bug写配置文件cat /etc/default/minio EOF MINIO_VOLUMES/data/minio MINIO_OPTS--address :9000 --console-address :9001 MINIO_ROOT_USERadmin MINIO_ROOT_PASSWORD12345678 EOF 逐行解释你写的内容 MINIO_VOLUMES/data/minio → 数据存在哪里 相当于告诉 MinIO 你的文件、图片、备份都保存在 /data/minio 目录 MINIO_OPTS--address :9000 --console-address :9001 → 启动端口 9000 文件传输端口 9001 网页管理端口 MINIO_ROOT_USERadmin MINIO_ROOT_PASSWORD12345678 → 登录网页的账号密码 你浏览器登录 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 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 密码你自己配置的[rootnfs ~]# mc ls minio-ha/studytxt [2026-03-29 14:49:34 CST] 3.4KiB STANDARD 初始化.txt相匹配注意常用操作mc ls minio # 查看存储桶 mc cp 文件名 minio/test # 上传文件 mc share download minio/test/文件名 # 生成共享链接举例实操[rootnfs ~]# mc alias set minio-ha http://192.168.24.100:9000 admin 12345678 Added minio-ha successfully. [rootnfs ~]# 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 /dataWeb 集群 MinIO 共享存储完整笔记场景1 台 MinIO 存储 2 台 Web 服务器实现所有网页文件统一存储、实时同步、集群共享替代 NFS。环境说明MinIO 服务器192.168.24.100Web 服务器 1web01Web 服务器 2web02MinIO 桶名studytxt账号admin/ 密码12345678网站根目录/var/www/html一、MinIO 服务器端操作192.168.24.1001. 确认 MinIO 正常运行# 查看 MinIO 服务状态 systemctl status minio说明确保状态为active (running)服务正常。2. 放行防火墙端口9000 给客户端用# 永久开放 9000 API 端口 firewall-cmd --permanent --add-port9000/tcp # 重载防火墙 firewall-cmd --reload说明允许 Web 机器访问 MinIO 存储接口。3. 上传测试网页到 MinIO# 新建测试首页 echo h1Hello MinIO Web Cluster/h1 index.html # 上传到 MinIO 的 studytxt 桶 mc cp index.html myminio/studytxt/ [rootha01 ~]# mc cp /index.html minio-one/studytxt/ /index.html: 32 B / 32 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 6.62 KiB/s 0s[rootha01 ~]# cd /data/minio/ [rootha01 minio]# ls studytxt [rootha01 minio]# cd studytxt/ [rootha01 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/htmlmkdir -p /var/www/html说明Nginx/Apache 默认网页目录。5. 挂载 MinIO 桶到网页目录s3fs studytxt /usr/share/nginx/html \ -o urlhttp://192.168.24.100:9000 \ -o allow_other \ -o use_path_request_style \ -o uid990 \ -o gid990 \ -o umask000 -o是必须要的 -o allow_other 允许非 root 用户访问挂载目录 nginx、apache 必须要这个参数否则无权读网页 -o use_path_request_style MinIO 必须加这个参数 告诉 s3fs 使用兼容模式访问 MinIO注意uid和gid要写nginx用户和组的[rootweb01 ~]# id nginx uid990(nginx) gid990(nginx) groups990(nginx)如果你不写这两行挂载后是rootnginx运行是nginx用户和用户组会导致403没有权限注意如果挂载有问题只要你一执行 df、ls、cd 这类命令都会无限等待看起来像卡死。s3fs 是网络挂载依赖 MinIO 服务器响应一旦MinIO 挂了网络不通防火墙拦截延迟太高系统去问 s3fs“你多大容量”s3fs 一直等 MinIO 回复 → 命令卡死不动umount -l /usr/share/nginx/html -l 懒惰卸载不管是否 busy 直接断开6. 验证挂载是否成功df -h [rootweb01 ~]# 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. 测试网页是否一致[rootweb01 ~]# curl localhost 192.168.24.100 172.17.0.1 ha01说明两台 Web 看到的内容完全一样实现共享。另一台可以自己配置nginx配置文件将家目录改为/var/www/html[rootweb02 html]# cat /etc/nginx/conf.d/web.conf server { listen 8080; server_name www.web.com; root /var/www/html; index index.html; }[rootweb02 html]# curl localhost:8080 192.168.24.100 172.17.0.1 ha01三、实现 “实时更新” 效果任意一台操作即可在 MinIO 服务器更新文件[rootha01 /]# echo hellow world index.html [rootha01 /]# mc cp /index.html minio-one/studytxt /index.html: 13 B / 13 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 1.56 KiB/s 0s两台 Web 服务器立即查看[rootweb02 html]# curl localhost:8080 hellow world [rootweb01 ~]# curl localhost hellow world结果两台 Web 同时更新无需同步、无需重启。四、设置开机自动挂载生产必须两台 Web 都执行echo s3fs#studytxt /usr/share/nginx/html fuse _netdev,allow_other,use_path_request_style,urlhttp://192.168.24.100:9000,uid$(id -u nginx),gid$(id -g nginx),umask000 0 0 /etc/fstab 1. s3fs#studytxt s3fs#固定开头告诉系统这是 s3fs 挂载 studytxtMinIO 桶名你要挂载的存储 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不用 NFS1. MinIO 是对象存储天生适合云原生、分布式、高并发无单点瓶颈可以集群、多副本、分布式扩展无限扩容存储空间想加就加高可用挂一台不影响整体适合图片、视频、静态资源、备份、上传文件你可以把对象存储理解成 一个巨大的、网络版的 “文件保险柜” 你存进去的每个文件 一个 对象Object 每个文件有一个唯一的名字key 没有文件夹层级、没有目录树、没有文件锁、没有 chmod、没有软链接 只支持 4 个操作上传、下载、删除、列表 就像 你把文件扔进去给它一个名字 要用的时候通过名字取回来。 对比 NFS 是文件夹共享有目录、有路径、能实时修改 MinIO/S3 是文件保险柜只存文件不搞复杂文件操作 为什么 Web 集群喜欢它 多台服务器都能通过 HTTP 上传 / 下载 不存在 “同时写一个文件冲突” 可以无限扩容 挂一台服务器不影响整体2. NFS 是文件共享本质是单点目录共享一台 NFS 挂了整个集群全部瘫痪并发高了性能直线下降不能跨机房、不能分布式扩容极其麻烦3. 权限 安全天差地别MinIO有 AK/SK 密钥、细粒度权限、签名 URL、审计日志NFS靠 IP 白名单 目录权限非常粗糙不安全4. 容器 K8s 环境首选 MinIONFS 在容器里经常权限乱套、延迟高、稳定性差MinIO 有标准 S3 接口所有语言都有 SDK非常友好5. 性能模型不同NFS实时强依赖网络延迟敏感一卡全卡MinIO基于 HTTP重试、分片、缓存友好更稳定二、NFS 明明是内核级别为什么反而 “不好用”内核级 ≠ 更好只代表 “在内核里跑”NFS 内核级带来的缺点远大于优点一旦卡死整个系统文件操作卡死df、ls、cd、rm 全卡住只能重启内核级故障 系统级故障NFS 宕机或网络抖动 → 直接引发应用卡死并发能力弱内核设计年代早不适应现代高并发 Web 集群扩展性几乎为零不能分布式、不能多活、不能跨域权限模型太简单不适合多租户、多项目、多业务线NFS 内核级 更依赖网络、更不稳定、更难排错三、MinIO Web 集群因为这是现代企业标准架构静态页面、图片、附件、用户上传 → 全部放 MinIOWeb 集群多台机器共享同一份资源改一次全站生效高可用、可扩展、安全、易运维符合云原生、微服务、容器化趋势而 NFS 已经逐渐退出核心 Web 集群架构。四、NFS 现在什么情况下才会用NFS 并没有死但场景非常固定1.小企业单服务器简单共享几台机器共享配置、脚本、小文件没有高并发、没有高可用要求2.VMware / 虚拟化环境共享存储虚拟机磁盘、模板共享传统 IT 基础架构仍大量使用这种情况最适合因为虚拟机本身就是一堆文件复制虚拟机移动虚拟机备份虚拟机批量删除挂载 ISO 这些情况minio做不了因为 MinIO 是对象存储没有文件夹结构没有文件锁 ------虚拟机跑系统时会经常锁定文件防止多个程序同时写一个文件导致损坏不能随机修改文件 -----MinIO 的机制是要改文件 全部重新上传一遍 不能随时改不能挂成系统盘 ------MinIO 是 HTTP 上传下载根本不是块设备 / 文件系统不能分区格式化随机读写交换分区等等延迟高 -----系统盘对延迟非常敏感。不支持热迁移 ----新主机看不到磁盘 磁盘不一致 直接宕机虚拟机跑在 MinIO 上 直接蓝屏 / 死机。3.老旧系统、传统应用不支持对象存储老 PHP、老 Java 项目写死本地路径只能用 NFS 硬挂4.内部小文件共享、非核心业务日志临时归集内部配置分发低压力、低访问量5.Linux 集群之间简单目录同步需求不需要高可用低成本、快速搭建