核心问题:MinIO集群是否需要配置nginx?
答案:
同时配置MinIO API(9000端口)和控制台(9001端口)的负载均衡。
创建配置文件:/etc/nginx/conf.d/minio-cluster.conf
# MinIO集群负载均衡配置
# 适用于67/68双机MinIO集群
# MinIO API负载均衡(9000端口)
upstream minio_api {
# 67机器节点
server 172.16.0.67:9000 weight=1 max_fails=3 fail_timeout=30s;
# 68机器节点
server 172.16.0.68:9000 weight=1 max_fails=3 fail_timeout=30s;
# 连接复用
keepalive 32;
}
# MinIO控制台负载均衡(9001端口)
upstream minio_console {
# 67机器控制台
server 172.16.0.67:9001 weight=1 max_fails=3 fail_timeout=30s;
# 68机器控制台
server 172.16.0.68:9001 weight=1 max_fails=3 fail_timeout=30s;
# 连接复用
keepalive 32;
}
# MinIO API服务(9000端口)
server {
listen 9000;
server_name minio-api.example.com; # 修改为实际域名或IP
# 访问日志
access_log /var/log/nginx/minio-api-access.log;
error_log /var/log/nginx/minio-api-error.log;
# 客户端请求体大小限制(根据实际需求调整)
client_max_body_size 10G;
# 超时设置(大文件上传需要较长超时)
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
# 代理配置
location / {
proxy_pass http://minio_api;
proxy_set_header Host $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;
# WebSocket支持(MinIO控制台需要)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 缓冲设置
proxy_buffering off;
proxy_request_buffering off;
# 错误处理
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
}
# 健康检查端点
location /minio/health/live {
proxy_pass http://minio_api;
access_log off;
}
}
# MinIO控制台服务(9001端口)
server {
listen 9001;
server_name minio-console.example.com; # 修改为实际域名或IP
# 访问日志
access_log /var/log/nginx/minio-console-access.log;
error_log /var/log/nginx/minio-console-error.log;
# 代理配置
location / {
proxy_pass http://minio_console;
proxy_set_header Host $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;
# WebSocket支持(控制台必需)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 缓冲设置
proxy_buffering off;
}
}
修改后端应用配置,连接到nginx而不是直接连接MinIO节点:
# application.yml
oss:
# 使用nginx统一入口,而不是直接连接MinIO节点
endpoint: http://172.16.0.67:9000 # nginx地址(可以是67或68机器)
# 或者使用域名
# endpoint: http://minio-api.example.com:9000
accessKey: minioadmin
secretKey: minioadmin@123456
bucketName: ruoyi
如果只需要API负载均衡,可以只配置9000端口:
# MinIO API负载均衡(简化版)
upstream minio_api {
server 172.16.0.67:9000 weight=1 max_fails=3 fail_timeout=30s;
server 172.16.0.68:9000 weight=1 max_fails=3 fail_timeout=30s;
keepalive 32;
}
server {
listen 9000;
server_name _;
client_max_body_size 10G;
location / {
proxy_pass http://minio_api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_request_buffering off;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
}
为MinIO API和控制台配置HTTPS:
# MinIO API HTTPS配置
server {
listen 443 ssl http2;
server_name minio-api.example.com;
# SSL证书配置
ssl_certificate /etc/nginx/ssl/minio-api.crt;
ssl_certificate_key /etc/nginx/ssl/minio-api.key;
# SSL优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
client_max_body_size 10G;
location / {
proxy_pass http://minio_api;
proxy_set_header Host $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_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_request_buffering off;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
}
# HTTP重定向到HTTPS
server {
listen 80;
server_name minio-api.example.com;
return 301 https://$server_name$request_uri;
}
# 在67机器上创建nginx配置
sudo vim /etc/nginx/conf.d/minio-cluster.conf
# 复制上面的配置内容
# 检查nginx配置语法
sudo nginx -t
# 如果测试通过,重新加载nginx
sudo nginx -s reload
# 或
sudo systemctl reload nginx
# 测试API端点
curl http://172.16.0.67:9000/minio/health/live
# 测试控制台(需要浏览器访问)
# http://172.16.0.67:9001
修改后端应用的MinIO连接配置,指向nginx地址。
# 限制控制台访问来源
server {
listen 9001;
server_name _;
# 只允许内网访问
allow 172.16.0.0/16;
allow 127.0.0.1;
deny all;
location / {
proxy_pass http://minio_console;
# ... 其他配置
}
}
# 在http块中添加
limit_req_zone $binary_remote_addr zone=minio_api_limit:10m rate=10r/s;
server {
listen 9000;
location / {
limit_req zone=minio_api_limit burst=20 nodelay;
proxy_pass http://minio_api;
# ... 其他配置
}
}
# 自定义日志格式
log_format minio_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'upstream: $upstream_addr '
'response_time: $upstream_response_time';
access_log /var/log/nginx/minio-api-access.log minio_format;
MinIO常用于大文件存储,需要特别注意:
# 必须关闭请求缓冲
proxy_buffering off;
proxy_request_buffering off;
# 增加超时时间
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
# 增加请求体大小限制
client_max_body_size 10G; # 根据实际需求调整
MinIO控制台需要WebSocket支持:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
确保nginx能够正确检测MinIO节点健康状态:
# 使用健康检查端点
location /minio/health/live {
proxy_pass http://minio_api;
access_log off;
}
upstream minio_api {
server 172.16.0.67:9000;
server 172.16.0.68:9000;
keepalive 32; # 保持32个连接
}
# 在nginx.conf主配置文件中
worker_processes auto;
worker_connections 4096;
对于频繁访问的静态资源,可以添加缓存:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
proxy_pass http://minio_api;
proxy_cache minio_cache;
proxy_cache_valid 200 1h;
expires 1h;
add_header Cache-Control "public";
}
原因:无法连接到MinIO节点
解决方法:
# 检查MinIO节点是否运行
curl http://172.16.0.67:9000/minio/health/live
curl http://172.16.0.68:9000/minio/health/live
# 检查nginx错误日志
tail -f /var/log/nginx/minio-api-error.log
原因:超时或请求体大小限制
解决方法:
# 增加超时时间
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
# 关闭缓冲
proxy_buffering off;
proxy_request_buffering off;
# 增加请求体大小
client_max_body_size 20G;
原因:WebSocket配置不正确
解决方法:
# 确保WebSocket配置正确
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
| 场景 | 是否需要nginx | 说明 |
|---|---|---|
| 开发/测试环境 | ❌ 不需要 | 直接连接MinIO节点即可 |
| 生产环境(小规模) | ⚠️ 可选 | 如果只有少量应用,可以直接连接 |
| 生产环境(大规模) | ✅ 强烈推荐 | 统一入口、负载均衡、安全加固 |
| 需要HTTPS | ✅ 必须 | nginx处理SSL/TLS |
| 多应用访问 | ✅ 推荐 | 简化配置管理 |
📝 文档版本: v1.0
🔄 最后更新: 2025-01-27
✅ 适用场景: 67/68双机MinIO集群nginx配置