使用 MinIO 自建云存储
1. MinIO 是什么
- 定位:一款高性能、开源的 对象存储(Object Storage)系统,完全兼容 AWS S3 API。
- 核心目标:提供轻量级、易部署的私有云存储方案,适用于云原生和大数据场景。
- 开源协议:GNU AGPL v3(商业版提供企业级支持)。
- 核心特性
- 高性能:
- 速度优势:支持并行多线程上传/下载,单节点吞吐量可达 10-100 Gbps
- 低延迟: 采用 Golang 编写,优化内存管理,响应时间在毫秒级
- S3 完全兼容
- 无缝迁移:所有 AWS S3 SDK、CLI 工具(如 awscli)可直接对接 MinIO。
- API 支持:覆盖 Put/Get/Object、分片上传、生命周期管理等全部 S3 操作
- 分布式架构
- 纠删码(Erasure Code):数据分片存储,允许节点故障自动恢复(如 4节点容忍2节点失效)。
- 多租户:支持为不同业务创建隔离的存储桶(Bucket)和访问策略。
- 轻量易部署
- 单二进制文件:无需复杂依赖,Docker/Kubernetes 一键部署。
- 资源占用低:单节点运行仅需 ~200MB 内存,适合边缘计算和 IoT 设备。
- 高性能:
- 适用场景
- 私有云存储
- 替代方案:替代阿里云 OSS、AWS S3,实现数据自主可控。
- 用例:企业文档库、备份归档。
- 大数据与 AI
- 兼容性:直接对接 Hadoop HDFS、Spark、TensorFlow 的 S3 接口。
- 用例:训练数据存储、模型版本管理。
- 云原生应用
- Kubernetes 集成:通过 CSI 驱动为容器提供持久化存储。
- 用例:微服务应用的文件共享。
- 边缘计算
- 轻量级:在树莓派等设备上运行,就近处理数据。
- 用例:物联网设备数据采集。
- 私有云存储
2. 部署 MinIO
- 方式一: docker部署
# 创建存储目录和配置文件 mkdir -p ~/minio/data ~/minio/config # 使用 Docker 启动 MinIO(单机版) docker run -d \ -p 9000:9000 \ # API 端口 -p 9001:9001 \ # 控制台端口 -v ~/minio/data:/data \ # 持久化存储 -v ~/minio/config:/root/.minio \ -e "MINIO_ROOT_USER=admin" \ -e "MINIO_ROOT_PASSWORD=yourpassword" \ --name minio \ minio/minio server /data --console-address ":9001" - 方式二: 原生二进制安装(推荐)
下载和安装
# Linux/macOS wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio sudo mv minio /usr/local/bin/ # 创建数据存储目录 mkdir -p ~/minio/data # 启动 MinIO(前台运行,默认端口 9000) export MINIO_ROOT_USER=admin export MINIO_ROOT_PASSWORD=yourpassword minio server ~/minio/data \ --address ":9002" \ # 自定义 API 端口 --console-address ":9001" # 自定义控制台端口配置系统服务(可选)
创建 Systemd 服务文件
/etc/systemd/system/minio.service内容如下[Unit] Description=MinIO Object Storage After=network.target [Service] User=root Group=root Environment="MINIO_ROOT_USER=admin" Environment="MINIO_ROOT_PASSWORD=yourpassword" ExecStart=/usr/local/bin/minio server /path/to/minio/data \ --console-address ":9001" --address ":9002" Restart=always LimitNOFILE=65536 [Install] WantedBy=multi-user.target启动服务
sudo systemctl daemon-reload sudo systemctl enable --now minio # 检查状态 sudo systemctl status minio # 禁用开机自启:sudo systemctl disable minio
- 访问控制台:http://服务器IP:9001,使用 admin 和 yourpassword 登录。
- 创建存储桶:
- 进入控制台 → Buckets → Create Bucket。
- 输入名称(如 wordpress-media),权限设为 public(或按需配置私有访问)。
3. 配置 HTTPS(可选但推荐)
- 生成自签名证书
mkdir -p ~/minio/certs openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout ~/minio/certs/private.key \ -out ~/minio/certs/public.crt \ -subj "/C=US/ST=State/L=City/O=Organization/CN=minio.yourdomain.com" - 重启 MinIO 启用 HTTPS
docker run -d \
-p 9000:9000 \
-p 9001:9001 \
-v ~/minio/data:/data \
-v ~/minio/certs:/root/.minio/certs \ # 挂载证书
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=yourpassword" \
--name minio \
minio/minio server /data --console-address ":9001"
- 访问 HTTPS 控制台:https://服务器IP:9001(浏览器需信任自签名证书)。
4.WordPress 集成 MinIO
- 安装插件
- 在 WordPress 后台 → 插件 → 安装插件,搜索 “WP Offload Media Lite” 并安装激活。
- 配置插件
- 进入设置:
- WordPress 后台 → 设置 → Offload Media。
- 填写 MinIO 信息:
- Storage Provider: 选择 “Amazon S3”(MinIO 兼容 S3 API)。
- Access Key ID: admin(MinIO 的 root 用户)。
- Secret Access Key: yourpassword。
- Bucket: wordpress-media(提前创建的存储桶名)。
- Endpoint: http://服务器IP:9000(HTTPS 则填 https://域名:9000)。
- Region: 留空或填 us-east-1(MinIO 忽略此字段)。
- 高级设置:
- 勾选 “Enable Path Style Access”(MinIO 必须开启)。
- 设置 “File URL” 为 http://服务器IP:9000/wordpress-media(或自定义域名)。
- 进入设置:
- 测试上传
- 在 WordPress 媒体库上传图片,检查是否自动同步到 MinIO 存储桶:
ls ~/minio/data/wordpress-media # 查看文件是否生成
5. 优化
- 绑定域名并启用 CDN
- 域名解析:将 media.yourdomain.com 解析到服务器 IP。
- Nginx 反向代理(示例配置):
server { listen 80; server_name media.yourdomain.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name media.yourdomain.com; ssl_certificate /etc/letsencrypt/live/media.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/media.yourdomain.com/privkey.pem; location / { proxy_pass http://localhost:9000; proxy_set_header Host $host; } } - 更新 WordPress 文件 URL:
- 在 WP Offload Media 设置中修改为 https://media.yourdomain.com/wordpress-media。
- 权限控制
- 私有文件访问:
- 在 MinIO 控制台将存储桶设为 private。
- 使用插件生成预签名 URL(需 Pro 版功能)。
- 私有文件访问:
- 监控与备份
- 监控:通过 MinIO 控制台的 Metrics 查看流量和存储。
- 备份:定期压缩 ~/minio/data 目录或使用 mc mirror 命令同步到其他存储。
- 通过 CDN 加速全球访问(如 Cloudflare)。
6. MinIO 的通用兼容性
MinIO 完全兼容 AWS S3 API,因此任何支持 S3 协议的工具、语言或框架均可直接调用。以下是集成方式(php)
使用 MinIO 官方 PHP SDK https://min.io/docs/minio/linux/developers/minio-drivers.html?ref=docs
composer require minio/minio<?php require 'vendor/autoload.php'; use Minio\MinioClient; // 初始化客户端 $minio = new MinioClient([ 'endpoint' => 'minio服务器IP:9000', 'accessKey' => 'admin', 'secretKey' => 'yourpassword', 'useSSL' => false // 如果是 HTTPS 则改为 true ]); // 上传文件 try { $minio->putObject([ 'Bucket' => 'wordpress-media', 'Key' => 'uploads/test.jpg', 'SourceFile' => '/var/www/html/test.jpg', ]); echo "上传成功"; } catch (Exception $e) { echo "错误: " . $e->getMessage(); }
7. 其他同类工具
- Ceph
- SeaweedFS
- GlusterFS