当应用程序需要存储大文件——照片、视频、日志、备份——时,你面临选择:Amazon S3(昂贵)或本地服务器存储(不可扩展)。对象存储是解决方案,MinIO是最佳选择——与S3 API兼容、成本大幅降低、运行在你自己的VPS上,无需按GB/月支付费用。
为什么选择MinIO而不是Amazon S3
Amazon S3是云存储的行业标准。然而,S3按GB/月计价(称为"按使用付费")。上传10TB/月意味着额外支付约$200。加上从泰国到AWS新加坡数据中心的延迟导致速度下降5-10倍。MinIO解决了这些问题。
- VPS上的MinIO — 购买一次VPS,在其磁盘上存储无限文件,无需按GB的月度费用
- S3 API兼容 — 为S3编写的Laravel、WordPress、Python等应用程序直接使用MinIO。只需更改端点URL。
- 超低延迟 — 数据存储在你的VPS上,响应速度比AWS快5-10倍
- 完全控制 — 无API调用限制或带宽限制。使用VPS能处理的任何资源。
- 2026年成本有效 — MinIO是免费的。只需支付VPS租赁费用(起价500泰铢/月,提供20-50GB+存储)
前置要求
- Ubuntu 20.04或更新版本的VPS,至少20GB存储空间(用于测试)
- 已安装Docker和Docker Compose(如未安装,请联系AsiaGB支持)
- 指向VPS IP的域名(获取SSL证书需要)
- 防火墙中打开端口9000(MinIO API)和9001(控制台UI)
- Root或sudo访问权限
目录结构
~/minio/
├── docker-compose.yml
├── .env
└── data/ # 对象存储目录(Docker外)
第一步 — 创建MinIO目录
mkdir -p ~/minio/data
cd ~/minio
chmod 700 data
第二步 — 创建.env配置文件
.env文件存储凭证和环境变量。
cat > .env << 'EOF'
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=YourSecurePassword123!
MINIO_SERVER_URL=https://minio.example.com:9000
MINIO_BROWSER_REDIRECT_URL=https://minio.example.com:9001
EOF
自定义:
MINIO_ROOT_USER— 访问密钥(选择强密码,≥8个字符)MINIO_ROOT_PASSWORD— 密钥(使用长的、复杂的密码)minio.example.com— 替换为你的实际域名
第三步 — 创建docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
minio:
image: minio/minio:latest
container_name: minio-server
restart: unless-stopped
env_file: .env
ports:
- "9000:9000"
- "9001:9001"
volumes:
- ./data:/data
- ./certs:/root/.minio/certs:ro
command: server /data --console-address ":9001"
networks:
- minio-net
networks:
minio-net:
driver: bridge
EOF
第四步 — 配置SSL证书
MinIO需要PEM格式的SSL证书。首先检查是否存在Let's Encrypt证书。
# 检查现有证书
ls -la /etc/letsencrypt/live/minio.example.com/
# 如果不存在,安装certbot
sudo apt-get install certbot python3-certbot-nginx -y
sudo certbot certonly --standalone -d minio.example.com
获得证书后,将其复制到MinIO:
# 创建MinIO证书目录
mkdir -p ~/minio/certs
# 复制证书文件
sudo cp /etc/letsencrypt/live/minio.example.com/fullchain.pem ~/minio/certs/public.crt
sudo cp /etc/letsencrypt/live/minio.example.com/privkey.pem ~/minio/certs/private.key
# 设置正确的权限
sudo chown $USER:$USER ~/minio/certs/*
chmod 600 ~/minio/certs/*
第五步 — 安装Nginx反向代理
MinIO直接运行在9000/9001端口。使用Nginx通过标准HTTPS 443端口代理这些端口。
cat > /etc/nginx/sites-available/minio.conf << 'EOF'
upstream minio_s3 {
server localhost:9000;
}
upstream minio_console {
server localhost:9001;
}
server {
listen 443 ssl http2;
server_name minio.example.com;
ssl_certificate /etc/letsencrypt/live/minio.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/minio.example.com/privkey.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
client_max_body_size 5000M;
# S3 API端点
location / {
proxy_pass https://minio_s3;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
}
# MinIO控制台(Web UI)
location /minio/ {
proxy_pass https://minio_console/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name minio.example.com;
return 301 https://$server_name$request_uri;
}
EOF
# 启用配置
sudo ln -s /etc/nginx/sites-available/minio.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
第六步 — 启动MinIO
cd ~/minio
docker-compose up -d
docker-compose logs -f minio
当你看到 All go.min.js, go.min.css files were cached 时,MinIO已成功启动。
✅ 测试SSL: 在浏览器中打开 https://minio.example.com:9001 或 https://minio.example.com/minio — 你应该看到MinIO登录页面。
第七步 — 访问MinIO控制台并创建存储桶
在浏览器中导航到 https://minio.example.com:9001。
- 访问密钥: 使用.env中的MINIO_ROOT_USER
- 密钥: 使用.env中的MINIO_ROOT_PASSWORD
登录后,点击"Buckets"→"Create Bucket"。
或者,使用MinIO客户端(mc)命令:
# 将MinIO添加为别名
mc alias set minio https://minio.example.com:9000 minioadmin YourSecurePassword123! --api S3v4
# 创建存储桶
mc mb minio/mybucket
# 启用版本控制(可选但推荐)
mc version enable minio/mybucket
第八步 — 为Web应用配置CORS
如果你的Web应用需要直接从浏览器上传文件到MinIO,必须启用CORS。
cat > cors.json << 'EOF'
{
"CORSRules": [
{
"AllowedOrigins": ["https://yourapp.com"],
"AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
"AllowedHeaders": ["*"],
"MaxAgeSeconds": 3000
}
]
}
EOF
mc cors set --config-file cors.json minio/mybucket
从应用程序连接
PHP + Laravel
// config/filesystems.php
'minio' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => 'us-east-1',
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => true,
];
// .env
AWS_ACCESS_KEY_ID=minioadmin
AWS_SECRET_ACCESS_KEY=YourSecurePassword123!
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=mybucket
AWS_ENDPOINT=https://minio.example.com:9000
AWS_URL=https://minio.example.com:9000
Python
from minio import Minio
client = Minio(
"minio.example.com:9000",
access_key="minioadmin",
secret_key="YourSecurePassword123!",
secure=True
)
# 上传文件
client.fput_object("mybucket", "myobject", "local_file.txt")
# 下载文件
client.fget_object("mybucket", "myobject", "downloaded_file.txt")
Node.js
const Minio = require('minio');
const minioClient = new Minio.Client({
endPoint: 'minio.example.com',
port: 9000,
useSSL: true,
accessKey: 'minioadmin',
secretKey: 'YourSecurePassword123!'
});
// 上传文件
minioClient.fPutObject('mybucket', 'myobject', 'local_file.txt', (err, etag) => {
if (err) return console.log(err);
console.log('File uploaded successfully!');
});
故障排查常见问题
MinIO启动失败 — 数据目录错误
# 检查权限
ls -la ~/minio/data
chmod 700 ~/minio/data
# 检查日志
docker-compose logs minio
# 重启
docker-compose restart minio
从应用程序连接时出现SSL证书错误
# 如果过期,更新证书
sudo certbot renew --force-renewal
# 复制更新的证书
sudo cp /etc/letsencrypt/live/minio.example.com/fullchain.pem ~/minio/certs/public.crt
sudo cp /etc/letsencrypt/live/minio.example.com/privkey.pem ~/minio/certs/private.key
# 重启MinIO
docker-compose down
docker-compose up -d
Nginx 413错误 — 请求实体太大
# 增加nginx配置中的client_max_body_size
client_max_body_size 5000M; # 根据需要调整
需要用于MinIO对象存储的VPS?
AsiaGB提供具有SSD存储和完全root访问权的Linux VPS,非常适合生产MinIO部署。从500泰铢/月起,提供20GB+SSD存储和99%正常运行时间保证。
立即开始使用AsiaGB