Files
hzdyjs/docs/部署文档/生产环境双机部署方案/MinIO集群Nginx配置指南.md
T
2025-11-27 00:02:01 +08:00

12 KiB
Raw Blame History

MinIO集群Nginx配置指南

📋 概述

核心问题:MinIO集群是否需要配置nginx?

答案:

  • ✅ 不是必须的:MinIO集群本身可以独立运行,客户端可以直接连接到任意节点
  • ✅ 但强烈建议配置:在生产环境中,nginx可以提供统一入口、负载均衡、SSL/TLS、安全加固等优势

🎯 配置nginx的好处

1. 统一访问入口

  • 无需配置多个节点IP:应用只需连接一个nginx地址
  • 简化配置管理:节点变更时只需修改nginx配置

2. 负载均衡

  • 请求分发:自动将请求分发到多个MinIO节点
  • 故障转移:节点故障时自动切换到健康节点
  • 性能优化:支持权重、健康检查等高级功能

3. SSL/TLS支持

  • HTTPS加密:为MinIO API和控制台提供HTTPS访问
  • 证书管理:统一管理SSL证书,无需在每个节点配置

4. 安全加固

  • IP白名单:限制访问来源
  • 限流保护:防止恶意请求
  • 访问日志:记录所有访问请求

5. 性能优化

  • 连接复用:keepalive连接池
  • 请求缓冲:优化大文件上传性能

🚀 配置方案

方案A:完整配置(推荐)

同时配置MinIO API(9000端口)和控制台(9001端口)的负载均衡。

1. Nginx配置文件

创建配置文件:/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;
    }
}

2. 应用配置修改

修改后端应用配置,连接到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

方案B:简化配置(仅API负载均衡)

如果只需要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;
    }
}

方案C:HTTPS配置(生产环境推荐)

为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地址。


🔒 安全加固配置

1. IP白名单(可选)

# 限制控制台访问来源
server {
    listen 9001;
    server_name _;
    
    # 只允许内网访问
    allow 172.16.0.0/16;
    allow 127.0.0.1;
    deny all;
    
    location / {
        proxy_pass http://minio_console;
        # ... 其他配置
    }
}

2. 限流保护

# 在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;
        # ... 其他配置
    }
}

3. 访问日志分析

# 自定义日志格式
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;

⚠️ 重要注意事项

1. 大文件上传配置

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;  # 根据实际需求调整

2. WebSocket支持

MinIO控制台需要WebSocket支持:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

3. 健康检查

确保nginx能够正确检测MinIO节点健康状态:

# 使用健康检查端点
location /minio/health/live {
    proxy_pass http://minio_api;
    access_log off;
}

📊 性能优化建议

1. 连接复用

upstream minio_api {
    server 172.16.0.67:9000;
    server 172.16.0.68:9000;
    keepalive 32;  # 保持32个连接
}

2. 工作进程优化

# 在nginx.conf主配置文件中
worker_processes auto;
worker_connections 4096;

3. 缓存配置(可选)

对于频繁访问的静态资源,可以添加缓存:

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";
}

🔍 故障排查

问题1:502 Bad Gateway

原因:无法连接到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

问题2:大文件上传失败

原因:超时或请求体大小限制

解决方法:

# 增加超时时间
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;

# 关闭缓冲
proxy_buffering off;
proxy_request_buffering off;

# 增加请求体大小
client_max_body_size 20G;

问题3:控制台无法访问

原因:WebSocket配置不正确

解决方法:

# 确保WebSocket配置正确
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

📚 相关文档


🎯 配置总结

是否需要配置nginx?

场景 是否需要nginx 说明
开发/测试环境 ❌ 不需要 直接连接MinIO节点即可
生产环境(小规模) ⚠️ 可选 如果只有少量应用,可以直接连接
生产环境(大规模) ✅ 强烈推荐 统一入口、负载均衡、安全加固
需要HTTPS ✅ 必须 nginx处理SSL/TLS
多应用访问 ✅ 推荐 简化配置管理

推荐配置方案

  • 开发环境:直接连接MinIO节点,无需nginx
  • 生产环境:使用方案A(完整配置),包括API和控制台负载均衡
  • 高安全要求:使用方案C(HTTPS配置)+ 安全加固

📝 文档版本: v1.0
🔄 最后更新: 2025-01-27
✅ 适用场景: 67/68双机MinIO集群nginx配置