本节摘要:从"测试集群"到"生产集群"隔着三道门:传输加密、统一入口、进程托管。本节逐一穿过去,最后合成一份可以直接抄进变更单的上线检查单——这套清单来自多次真实割接的教训,每一项背后都有一次没做导致的事故。
先说一次没过关的教训。某团队的内网 MinIO 集群上线半年一直裸跑 HTTP,直到一次安全扫描把"S3 凭证明文传输"列为高危项——问题不在于内网有多危险,而在于 AccessKey 一旦在某个被控的跳板机上被抓包,整个数据仓库等于交了钥匙。TLS、负载均衡、进程托管三件事的共同点是:平时感觉不到,出事时全是大事。
MinIO 对 TLS 的支持方式近乎朴素:把证书与私钥放进名为 certs 的配置目录(默认在运行用户主目录下的 .minio/certs),重启进程,服务端自动切换为 HTTPS——无需任何配置开关。要点有三:
# 证书与私钥命名约定:public.crt 与 private.key # 集群四台机器都要放同一套证书(或每台放各自主机名的证书) mkdir -p /home/minio-user/.minio/certs cp star.example.com.crt /home/minio-user/.minio/certs/public.crt cp star.example.com.key /home/minio-user/.minio/certs/private.key chown -R minio-user:minio-user /home/minio-user/.minio chmod 600 /home/minio-user/.minio/certs/private.key # 重启后验证 mc alias set fleet https://s3.internal.example.com admin 'Chang3Me!2026' mc admin info fleet
三处细节决定成败。私钥权限必须是 600,运行用户之外的任何人都读不得——安全扫描的头号靶子。内部 CA 签发的证书要让客户端信任:mc 客户端用 mc alias set 时指向受信 CA 目录,SDK 侧把内部 CA 挂进系统信任链。证书到期监控要纳入告警,存储证书静默过期是经典事故:所有客户端突然集体握手失败,而存储团队毫不知情。给证书域名加一条独立的到期监控,成本一分钟,收益一场深夜免醒。
四节点集群对外有四个 9000 端口。应用直连某一个节点,等于把单点故障请回来——那个节点重启,你的业务跟着重启。负载均衡把四个后端收敛成一个虚拟地址,健康检查自动摘除故障节点。
Nginx 的最小可用配置长这样:
upstream minio_s3_api { least_conn; server minio-1:9000 max_fails=2 fail_timeout=10s; server minio-2:9000 max_fails=2 fail_timeout=10s; server minio-3:9000 max_fails=2 fail_timeout=10s; server minio-4:9000 max_fails=2 fail_timeout=10s; } server { listen 443 ssl; server_name s3.internal.example.com; ssl_certificate /etc/pki/tls/certs/star.example.com.crt; ssl_certificate_key /etc/pki/tls/private/star.example.com.key; # 大文件上传的关键:请求体不进 Nginx 缓冲,直接透传 client_max_body_size 0; proxy_buffering off; proxy_request_buffering off; location / { proxy_pass http://minio_s3_api; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } }
四行配置里藏着生产事故的种子,逐个拆解:client_max_body_size 0 取消上传大小限制,否则几个 G 的备份包会被 Nginx 用 413 拒之门外;proxy_buffering off 与 proxy_request_buffering off 让大对象流式透传,不在代理层落盘;Host 头原样传递,MinIO 的签名校验(V4 签名把主机名算进签名串)才能通过——漏了这行,签名错误会让你排查一整晚。另外,S3 API 与控制台建议分设两个子域(如 s3 与 console)各自转发,控制台子域加一道额外的办公网访问限制。

生产进程由 systemd 接管,断电、崩溃、主机重启后自动回归。服务单元的核心段如下:
# /etc/systemd/system/minio.service(四台一致) [Unit] Description=MinIO Object Storage After=network-online.target Wants=network-online.target [Service] User=minio-user Group=minio-user EnvironmentFile=/etc/default/minio ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS Restart=always RestartSec=5 LimitNOFILE=65536 TasksMax=infinity [Install] WantedBy=multi-user.target
Restart=always 加五秒退避,让节点在崩溃后自愈;LimitNOFILE 抬高到 65536 以上,MinIO 的并发连接与文件句柄远超默认的 1024,句柄耗尽的表现是"莫名 connection refused"。EnvironmentFile 指向 2.2 写好的变量文件——启动参数、凭证、集群拓扑全部集中在一个文件里,四台机器配置 diff 为空才算合格。
把三道门折成一页纸,逐项打勾后才允许割接流量:
| 项 | 验收标准 | 不合格的典型症状 |
|---|---|---|
| 集群拓扑 | 管理信息显示节点与盘全部在线,池与纠删集符合规划 | 有盘 offline,纠删集数量与纸面不符 |
| TLS | 客户端以 https 走通读写,证书链完整,到期日大于 60 天 | 需要跳过证书校验才能连接 |
| 负载均衡 | 摘除任一节点后读写继续,恢复后自动回归 | 单节点重启导致业务报错 |
| 进程托管 | 重启主机,服务 60 秒内自动回归并重挂盘 | 断电后要人肉登录拉起 |
| 句柄与并发 | 句柄上限不小于 65536,压测万级并发无 refused | 高峰期随机连接失败 |
| 管理口隔离 | 控制台子域与 9001 端口不在办公网段可达 | 控制台暴露在全员网段 |
| 凭证管理 | root 凭证在密码库托管,应用全部使用专用子账号 | 应用直接使用 root 凭证 |
最后一项提前剧透第 6 章:root 凭证只该出现在初始化和应急场景,日常访问用 IAM 子账号加策略收敛——这是守仓纪律的第一条。
仓已建成、门已上锁。第 3 章钻进底座:看看你的数据凭什么在盘坏、节点宕、比特翻转之后还活着。