按 Enter 键跳转到正文

使用 MinIO 自建云存储

使用 MinIO 自建云存储

1. MinIO 是什么

  • 定位:一款高性能、开源的 对象存储(Object Storage)系统,完全兼容 AWS S3 API。
  • 核心目标:提供轻量级、易部署的私有云存储方案,适用于云原生和大数据场景。
  • 开源协议:GNU AGPL v3(商业版提供企业级支持)。
  1. 核心特性
    1. 高性能:
      1. 速度优势:支持并行多线程上传/下载,单节点吞吐量可达 10-100 Gbps
      2. 低延迟: 采用 Golang 编写,优化内存管理,响应时间在毫秒级
    2. S3 完全兼容
      1. 无缝迁移:所有 AWS S3 SDK、CLI 工具(如 awscli)可直接对接 MinIO。
      2. API 支持:覆盖 Put/Get/Object、分片上传、生命周期管理等全部 S3 操作
    3. 分布式架构
      1. 纠删码(Erasure Code):数据分片存储,允许节点故障自动恢复(如 4节点容忍2节点失效)。
      2. 多租户:支持为不同业务创建隔离的存储桶(Bucket)和访问策略。
    4. 轻量易部署
      1. 单二进制文件:无需复杂依赖,Docker/Kubernetes 一键部署。
      2. 资源占用低:单节点运行仅需 ~200MB 内存,适合边缘计算和 IoT 设备。
  2. 适用场景
    1. 私有云存储
      • 替代方案:替代阿里云 OSS、AWS S3,实现数据自主可控。
      • 用例:企业文档库、备份归档。
    2. 大数据与 AI
      • 兼容性:直接对接 Hadoop HDFS、Spark、TensorFlow 的 S3 接口。
      • 用例:训练数据存储、模型版本管理。
    3. 云原生应用
      • Kubernetes 集成:通过 CSI 驱动为容器提供持久化存储。
      • 用例:微服务应用的文件共享。
    4. 边缘计算
      • 轻量级:在树莓派等设备上运行,就近处理数据。
      • 用例:物联网设备数据采集。

2. 部署 MinIO

  1. 方式一: docker部署
     1# 创建存储目录和配置文件
     2mkdir -p ~/minio/data ~/minio/config
     3
     4# 使用 Docker 启动 MinIO(单机版)
     5docker run -d \
     6-p 9000:9000 \          # API 端口
     7-p 9001:9001 \          # 控制台端口
     8-v ~/minio/data:/data \ # 持久化存储
     9-v ~/minio/config:/root/.minio \
    10-e "MINIO_ROOT_USER=admin" \
    11-e "MINIO_ROOT_PASSWORD=yourpassword" \
    12--name minio \
    13minio/minio server /data --console-address ":9001"
    
  2. 方式二: 原生二进制安装(推荐)
    1. 下载和安装

       1# Linux/macOS
       2wget https://dl.min.io/server/minio/release/linux-amd64/minio
       3chmod +x minio
       4sudo mv minio /usr/local/bin/
       5
       6# 创建数据存储目录
       7mkdir -p ~/minio/data
       8
       9# 启动 MinIO(前台运行,默认端口 9000)
      10export MINIO_ROOT_USER=admin
      11export MINIO_ROOT_PASSWORD=yourpassword
      12minio server ~/minio/data \
      13--address ":9002" \          # 自定义 API 端口
      14--console-address ":9001"    # 自定义控制台端口
      
    2. 配置系统服务(可选)

      创建 Systemd 服务文件 /etc/systemd/system/minio.service 内容如下

       1[Unit]
       2Description=MinIO Object Storage
       3After=network.target
       4
       5[Service]
       6User=root
       7Group=root
       8Environment="MINIO_ROOT_USER=admin"
       9Environment="MINIO_ROOT_PASSWORD=yourpassword"
      10ExecStart=/usr/local/bin/minio server /path/to/minio/data \
      11--console-address ":9001"
      12--address ":9002"
      13
      14Restart=always
      15LimitNOFILE=65536
      16
      17[Install]
      18WantedBy=multi-user.target
      
    3. 启动服务

      1sudo systemctl daemon-reload
      2sudo systemctl enable --now minio
      3# 检查状态
      4sudo systemctl status minio
      5
      6# 禁用开机自启:sudo systemctl disable minio
      
  • 访问控制台:http://服务器IP:9001,使用 admin 和 yourpassword 登录。
  • 创建存储桶:
    • 进入控制台 → Buckets → Create Bucket。
    • 输入名称(如 wordpress-media),权限设为 public(或按需配置私有访问)。

3. 配置 HTTPS(可选但推荐)

  1. 生成自签名证书
    1mkdir -p ~/minio/certs
    2openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    3-keyout ~/minio/certs/private.key \
    4-out ~/minio/certs/public.crt \
    5-subj "/C=US/ST=State/L=City/O=Organization/CN=minio.yourdomain.com"
    
  2. 重启 MinIO 启用 HTTPS
1docker run -d \
2  -p 9000:9000 \
3  -p 9001:9001 \
4  -v ~/minio/data:/data \
5  -v ~/minio/certs:/root/.minio/certs \  # 挂载证书
6  -e "MINIO_ROOT_USER=admin" \
7  -e "MINIO_ROOT_PASSWORD=yourpassword" \
8  --name minio \
9  minio/minio server /data --console-address ":9001"
  • 访问 HTTPS 控制台:https://服务器IP:9001(浏览器需信任自签名证书)。

4.WordPress 集成 MinIO

  1. 安装插件
    1. 在 WordPress 后台 → 插件 → 安装插件,搜索 “WP Offload Media Lite” 并安装激活。
  2. 配置插件
    1. 进入设置:
      1. WordPress 后台 → 设置 → Offload Media。
    2. 填写 MinIO 信息:
      1. Storage Provider: 选择 “Amazon S3”(MinIO 兼容 S3 API)。
      2. Access Key ID: admin(MinIO 的 root 用户)。
      3. Secret Access Key: yourpassword。
      4. Bucket: wordpress-media(提前创建的存储桶名)。
      5. Endpoint: http://服务器IP:9000(HTTPS 则填 https://域名:9000)。
      6. Region: 留空或填 us-east-1(MinIO 忽略此字段)。
    3. 高级设置:
      1. 勾选 “Enable Path Style Access”(MinIO 必须开启)。
      2. 设置 “File URL” 为 http://服务器IP:9000/wordpress-media(或自定义域名)。
  3. 测试上传
    1. 在 WordPress 媒体库上传图片,检查是否自动同步到 MinIO 存储桶:
    1ls ~/minio/data/wordpress-media  # 查看文件是否生成
    

5. 优化

  1. 绑定域名并启用 CDN
    1. 域名解析:将 media.yourdomain.com 解析到服务器 IP。
    2. Nginx 反向代理(示例配置):
       1server {
       2    listen 80;
       3    server_name media.yourdomain.com;
       4    return 301 https://$host$request_uri;
       5}
       6
       7server {
       8    listen 443 ssl;
       9    server_name media.yourdomain.com;
      10
      11    ssl_certificate /etc/letsencrypt/live/media.yourdomain.com/fullchain.pem;
      12    ssl_certificate_key /etc/letsencrypt/live/media.yourdomain.com/privkey.pem;
      13
      14    location / {
      15        proxy_pass http://localhost:9000;
      16        proxy_set_header Host $host;
      17    }
      18}
      
    3. 更新 WordPress 文件 URL:
      1. 在 WP Offload Media 设置中修改为 https://media.yourdomain.com/wordpress-media
  2. 权限控制
    1. 私有文件访问:
      1. 在 MinIO 控制台将存储桶设为 private。
      2. 使用插件生成预签名 URL(需 Pro 版功能)。
  3. 监控与备份
    1. 监控:通过 MinIO 控制台的 Metrics 查看流量和存储。
    2. 备份:定期压缩 ~/minio/data 目录或使用 mc mirror 命令同步到其他存储。
  4. 通过 CDN 加速全球访问(如 Cloudflare)。

6. MinIO 的通用兼容性

MinIO 完全兼容 AWS S3 API,因此任何支持 S3 协议的工具、语言或框架均可直接调用。以下是集成方式(php)

  1. 使用 MinIO 官方 PHP SDK https://min.io/docs/minio/linux/developers/minio-drivers.html?ref=docs

    1composer require minio/minio
    
     1<?php
     2require 'vendor/autoload.php';
     3
     4use Minio\MinioClient;
     5
     6// 初始化客户端
     7$minio = new MinioClient([
     8    'endpoint' => 'minio服务器IP:9000',
     9    'accessKey' => 'admin',
    10    'secretKey' => 'yourpassword',
    11    'useSSL' => false // 如果是 HTTPS 则改为 true
    12]);
    13
    14// 上传文件
    15try {
    16    $minio->putObject([
    17        'Bucket' => 'wordpress-media',
    18        'Key'    => 'uploads/test.jpg',
    19        'SourceFile' => '/var/www/html/test.jpg',
    20    ]);
    21    echo "上传成功";
    22} catch (Exception $e) {
    23    echo "错误: " . $e->getMessage();
    24}
    

7. 其他同类工具

  1. Ceph
  2. SeaweedFS
  3. GlusterFS

发表评论