MinIO HTTPS 反代与对象直链访问
实施基地:基地 A
参考基地:基地 B
服务器:minio-77(Ubuntu 20.04)
内网 IP:10.10.238.77
编制日期:2026-06-15
一、需求背景
- 通过 Nginx 以 HTTPS 访问 MinIO 服务,证书使用
/data/ssl/tls.pem、/data/ssl/tls.key(*.igozhang.cn)。 - 对齐基地 B 能力:通过域名直链访问桶内图片,例如:
https://ossapi-humom.igozhang.cn/standard/mom/ipqc/projectImage/xxx.jpg - Console 管理界面需通过 HTTPS 访问,且加载速度正常。
- 部署方式: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含回环记录
八、运维备注
- 证书续期后更新
/data/ssl/并systemctl reload nginx。 - MinIO 重启后确认
/etc/default/minio未丢失。 - 新增直链桶:评估
mc anonymous set download或细粒度策略。 - 可迁移至基地 B 中心 Nginx(10.10.240.87)反代模式。
- 一键重装:
bash scripts/deploy-minio-https-基地A-脱敏.sh(会覆盖配置,慎用)。