igozhang

——

    MinIO HTTPS 反代与对象直链访问

    实施基地:基地 A
    参考基地:基地 B
    服务器:minio-77(Ubuntu 20.04)
    内网 IP:10.10.238.77
    编制日期:2026-06-15


    一、需求背景

    1. 通过 Nginx 以 HTTPS 访问 MinIO 服务,证书使用 /data/ssl/tls.pem/data/ssl/tls.key*.igozhang.cn)。
    2. 对齐基地 B 能力:通过域名直链访问桶内图片,例如:
      https://ossapi-humom.igozhang.cn/standard/mom/ipqc/projectImage/xxx.jpg
    3. Console 管理界面需通过 HTTPS 访问,且加载速度正常。
    4. 部署方式:DNS/hosts 直连 MinIO 服务器,SSL 在 minio-77 本机 Nginx 终结。

    二、目标架构(对齐基地 B)

    2.1 基地 A(本次实施)

    域名 用途 Nginx 443 反代目标
    ossapi-humom.igozhang.cn S3 API / 图片直链 127.0.0.1:9000
    oss-humom.igozhang.cn Console 管理界面 127.0.0.1:9001

    2.2 基地 B(参考架构)

    中心 Nginx 服务器:10.10.240.87(nginx02)

    域名 用途 后端
    ossapi-ywmom.igozhang.cn S3 API / 图片直链 10.10.240.88:9002
    oss-ywmom.igozhang.cn Console 管理界面 10.10.240.88:9001

    差异说明:基地 B SSL 在中心 Nginx 终结;基地 A 网络独立,SSL 在 MinIO 本机(10.10.238.77)终结。


    三、配置部署命令(minio-77 按序执行)

    minio-77(10.10.238.77)上以 root 按顺序执行,每段可直接整段复制。
    一键脚本备选:scripts/deploy-minio-https-基地A-脱敏.sh(修改密码后 bash 执行)。

    3.0 前置检查(只读)

    ss -tlnp | grep -E ':(9000|9001|443)\s'
    ls -la /data/ssl/tls.pem /data/ssl/tls.key
    curl -s -o /dev/null -w "api_9000=%{http_code}\n" http://127.0.0.1:9000/minio/health/live
    curl -s -o /dev/null -w "console_9001=%{http_code}\n" http://127.0.0.1:9001/
    

    3.1 安装 mc 客户端(若未安装)

    wget -q --timeout=8 --tries=1 https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc
    chmod +x /usr/local/bin/mc
    mc --version
    

    3.2 桶匿名下载策略(standard 桶直链必需)

    mc alias set localminio http://127.0.0.1:9000 minioadmin '<你的密码>'
    mc anonymous set download localminio/standard
    mc anonymous get localminio/standard
    

    3.3 MinIO 环境变量 /etc/default/minio

    方式 A:整段写入(新环境推荐)

    cat > /etc/default/minio <<'EOF'
    MINIO_VOLUMES="/data/minio"
    MINIO_OPTS="--console-address :9001 --address :9000"
    MINIO_ROOT_USER="minioadmin"
    MINIO_ROOT_PASSWORD="<你的密码>"
    
    MINIO_BROWSER_REDIRECT=false
    MINIO_SERVER_URL="https://ossapi-humom.igozhang.cn"
    MINIO_BROWSER_REDIRECT_URL="https://oss-humom.igozhang.cn/"
    EOF
    

    方式 B:在已有文件上追加/更新

    grep -q '^MINIO_BROWSER_REDIRECT=' /etc/default/minio && sed -i 's/^MINIO_BROWSER_REDIRECT=.*/MINIO_BROWSER_REDIRECT=false/' /etc/default/minio || echo 'MINIO_BROWSER_REDIRECT=false' >> /etc/default/minio
    grep -q '^MINIO_SERVER_URL=' /etc/default/minio && sed -i 's|^MINIO_SERVER_URL=.*|MINIO_SERVER_URL="https://ossapi-humom.igozhang.cn"|' /etc/default/minio || echo 'MINIO_SERVER_URL="https://ossapi-humom.igozhang.cn"' >> /etc/default/minio
    grep -q '^MINIO_BROWSER_REDIRECT_URL=' /etc/default/minio && sed -i 's|^MINIO_BROWSER_REDIRECT_URL=.*|MINIO_BROWSER_REDIRECT_URL="https://oss-humom.igozhang.cn/"|' /etc/default/minio || echo 'MINIO_BROWSER_REDIRECT_URL="https://oss-humom.igozhang.cn/"' >> /etc/default/minio
    cat /etc/default/minio
    
    变量 作用
    MINIO_SERVER_URL 浏览器侧 S3 API 外部地址
    MINIO_BROWSER_REDIRECT_URL Console 外部地址(末尾需 /
    MINIO_BROWSER_REDIRECT=false 禁止 API 根路径跳转 :9001

    3.4 服务器本机 hosts(Console 不转圈必需)

    grep -q 'ossapi-humom.igozhang.cn' /etc/hosts || echo '127.0.0.1 ossapi-humom.igozhang.cn oss-humom.igozhang.cn' >> /etc/hosts
    grep igozhang /etc/hosts
    

    配置 MINIO_SERVER_URL 后,Console 处理 session 时会回环访问该 URL;无解析时每次阻塞约 10 秒

    3.5 Nginx WebSocket map

    cat > /etc/nginx/conf.d/connection_upgrade.conf <<'EOF'
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
    EOF
    

    3.6 Nginx API 站点 ossapi-humom → 9000

    cat > /etc/nginx/sites-available/minio-console.conf <<'EOF'
    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name ossapi-humom.igozhang.cn;
    
        ssl_certificate     /data/ssl/tls.pem;
        ssl_certificate_key /data/ssl/tls.key;
        ssl_protocols       TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
    
        ignore_invalid_headers off;
        client_max_body_size 0;
        proxy_buffering off;
        proxy_request_buffering off;
    
        location = / {
            default_type text/plain;
            return 200 "MinIO S3 API - use object path URL\n";
        }
    
        location ~* \.jpe?g$ {
            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 300;
            proxy_pass http://127.0.0.1:9000;
            proxy_hide_header Content-Type;
            proxy_hide_header X-Content-Type-Options;
            add_header Content-Type image/jpeg always;
        }
    
        location ~* \.png$ {
            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 300;
            proxy_pass http://127.0.0.1:9000;
            proxy_hide_header Content-Type;
            proxy_hide_header X-Content-Type-Options;
            add_header Content-Type image/png always;
        }
    
        location ~* \.gif$ {
            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 300;
            proxy_pass http://127.0.0.1:9000;
            proxy_hide_header Content-Type;
            proxy_hide_header X-Content-Type-Options;
            add_header Content-Type image/gif always;
        }
    
        location ~* \.webp$ {
            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 300;
            proxy_pass http://127.0.0.1:9000;
            proxy_hide_header Content-Type;
            proxy_hide_header X-Content-Type-Options;
            add_header Content-Type image/webp always;
        }
    
        location / {
            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 300;
            proxy_pass http://127.0.0.1:9000;
        }
    }
    
    server {
        listen 80;
        listen [::]:80;
        server_name ossapi-humom.igozhang.cn;
        return 301 https://$host$request_uri;
    }
    EOF
    

    3.7 Nginx Console 站点 oss-humom → 9001

    cat > /etc/nginx/sites-available/minio-oss.conf <<'EOF'
    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name oss-humom.igozhang.cn;
    
        ssl_certificate     /data/ssl/tls.pem;
        ssl_certificate_key /data/ssl/tls.key;
        ssl_protocols       TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
    
        ignore_invalid_headers off;
        client_max_body_size 0;
        proxy_buffering off;
        proxy_request_buffering off;
    
        location / {
            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_set_header X-NginX-Proxy true;
            proxy_connect_timeout 300;
            proxy_send_timeout 300;
            proxy_read_timeout 300;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            chunked_transfer_encoding off;
            proxy_pass http://127.0.0.1:9001;
        }
    }
    
    server {
        listen 80;
        listen [::]:80;
        server_name oss-humom.igozhang.cn;
        return 301 https://$host$request_uri;
    }
    EOF
    

    Console 站点必须使用 $connection_upgrade,禁止写 Connection "upgrade"(会导致 session 挂起)。

    3.8 启用站点并重载 Nginx

    ln -sf /etc/nginx/sites-available/minio-console.conf /etc/nginx/sites-enabled/minio-console.conf
    ln -sf /etc/nginx/sites-available/minio-oss.conf /etc/nginx/sites-enabled/minio-oss.conf
    nginx -t
    systemctl reload nginx
    

    3.9 重启 MinIO

    systemctl restart minio
    sleep 3
    systemctl is-active minio
    

    3.10 验收命令(服务器本机)

    echo "=== 图片直链 ==="
    curl -skI --resolve ossapi-humom.igozhang.cn:443:127.0.0.1 \
      https://ossapi-humom.igozhang.cn/standard/mom/ipqc/projectImage/1781012373449.jpg \
      | grep -iE 'HTTP|content-type|x-content-type'
    
    echo "=== Console session(应 < 0.1s)==="
    curl -sk -o /dev/null -w "time=%{time_total}s code=%{http_code}\n" \
      --resolve oss-humom.igozhang.cn:443:127.0.0.1 \
      https://oss-humom.igozhang.cn/api/v1/session
    
    echo "=== API 健康 ==="
    curl -sk -o /dev/null -w "time=%{time_total}s code=%{http_code}\n" \
      https://ossapi-humom.igozhang.cn/minio/health/live
    
    echo "=== 监听 ==="
    ss -tlnp | grep -E ':(80|443|9000|9001)\s'
    

    预期:图片 Content-Type: image/jpeg;session time < 0.1s;health code=200

    3.11 客户端测试 hosts(Windows)

    文件:C:\Windows\System32\drivers\etc\hosts

    10.10.238.77 ossapi-humom.igozhang.cn
    10.10.238.77 oss-humom.igozhang.cn
    
    ipconfig /flushdns
    

    四、配置文件清单

    文件 说明
    /etc/default/minio MinIO 环境变量
    /etc/hosts 本机域名回环
    /etc/nginx/conf.d/connection_upgrade.conf WebSocket map
    /etc/nginx/sites-available/minio-console.conf API 站点
    /etc/nginx/sites-available/minio-oss.conf Console 站点

    五、问题与处理记录

    问题 根因 处理
    登录报 Access Key 不存在 用户名误用 admin,应为 minioadmin 使用正确账号
    图片 HTTPS 裂图 ① 反代 9001;② 桶 PRIVATE;③ octet-stream + nosniff 改反代 9000、匿名读、修正 Content-Type
    访问 /:9001 MinIO 浏览器重定向 + Chrome 缓存 MINIO_BROWSER_REDIRECT=false、清缓存
    Firefox 正常、Chrome 裂图 Chrome 缓存旧 Console HTML 清站点数据 + 无痕
    Console HTTPS 转圈约 10 秒 Connection "upgrade" 误用;② 服务器无法解析 API 域名 WebSocket map + /etc/hosts
    oss-humom NXDOMAIN 客户端 hosts 未配置 hosts 增加两行

    六、访问方式与 DNS

    用途 地址 说明
    图片直链 https://ossapi-humom.igozhang.cn/standard/.../xxx.jpg 勿访问 /
    Console https://oss-humom.igozhang.cn 账号 minioadmin
    内网 Console http://10.10.238.77:9001 HTTP 备用
    ❌ 错误 https://ossapi-humom...:9001 9001 无 SSL

    生产 DNS

    ossapi-humom.igozhang.cn  →  A  →  10.10.238.77
    oss-humom.igozhang.cn     →  A  →  10.10.238.77
    

    防火墙放行 443


    七、验收检查清单

    • 图片直链 200,Content-Type: image/jpeg
    • /api/v1/session < 0.1s
    • Chrome/Firefox 图片正常
    • Console 秒开可登录
    • 根路径不跳 :9001
    • 服务器 /etc/hosts 含回环记录

    八、运维备注

    1. 证书续期后更新 /data/ssl/systemctl reload nginx
    2. MinIO 重启后确认 /etc/default/minio 未丢失。
    3. 新增直链桶:评估 mc anonymous set download 或细粒度策略。
    4. 可迁移至基地 B 中心 Nginx(10.10.240.87)反代模式。
    5. 一键重装:bash scripts/deploy-minio-https-基地A-脱敏.sh(会覆盖配置,慎用)。

    MP3