问题背景

在1Panel中通过Docker部署MinIO后,使用Nginx反向代理访问时遇到以下问题:

  1. 访问域名后自动跳转到 http://127.0.0.1:9001

  1. 出现循环重定向错误

  1. 静态资源(CSS/JS)加载失败(404)

根本原因

1. MinIO Console跳转问题

MinIO Console默认使用它实际监听的地址(127.0.0.1:9001)来生成URL,而不是外部域名。

2. Nginx配置冲突

  • listen 80listen 443 同时存在时,HTTP到HTTPS的重定向配置不当会导致循环

  • 静态资源location拦截了请求,没有代理到MinIO

解决方案

方案1:内网直连(推荐用于后端API)

后端直接连接MinIO内网地址,不走反向代理:

storage:
  enabled: true
  endpoint: "127.0.0.1:9000"    # 内网直连
  access_key: "key"           # MINIO_ROOT_USER
  secret_key: "secret"     # MINIO_ROOT_PASSWORD
  use_ssl: false                   # 内网不用HTTPS
  bucket: "team"
  public_base_url: "https://s3.example.com/team"  # 对外暴露的URL

方案2:分开两个域名(推荐用于生产环境)

域名

端口

用途

minio-console.example.com

9001

Console管理界面

s3.example.com

9000

API接口(后端调用)

Console域名Nginx配置(需要处理跳转):

server {
    listen 80;
    server_name minio-console.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name minio-console.example.com;
    
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    
    location / {
        proxy_pass http://127.0.0.1:9001/;
        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_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_redirect off;  # 关闭重定向修改
    }
}

API域名Nginx配置(最简单,无跳转问题):

server {
    listen 80;
    server_name s3.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name s3.example.com;
    
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    
    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 50M;
    }
}

方案3:重建MinIO容器(彻底解决跳转)

如果必须用一个域名访问Console,需要设置环境变量:

docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -e MINIO_ROOT_USER=admin \
  -e MINIO_ROOT_PASSWORD=password123 \
  -e MINIO_BROWSER_REDIRECT_URL="https://minio.example.com/" \
  -v /opt/minio/data:/data \
  --restart always \
  minio/minio server /data --console-address ":9001"

关键环境变量:MINIO_BROWSER_REDIRECT_URL

避坑指南

1. 不要用1Panel默认的静态资源location

# 这个配置会拦截CSS/JS请求,导致MinIO Console页面加载失败
location ~ .*\.(js|css|png|jpg)... {
    expires 30d;
    ...
}

删除这个location块!

2. 不要同时存在多种重定向配置

  • 不要在同一个server块中同时用 listen 80listen 443

  • HTTP到HTTPS重定向应该放在单独的server块中

3. 后端配置要点

场景

endpoint

use_ssl

public_base_url

内网直连

127.0.0.1:9000

false

https://域名/桶名

反向代理

域名:443

true

https://域名/桶名

4. 必须创建bucket并设置公开访问

docker exec -it minio sh
mc alias set local http://localhost:9000 team secret
mc mb local/lover-team          # 创建bucket
mc anonymous set download local/team  # 设置公开访问
exit

调试命令

# 检查MinIO容器状态
docker ps | grep minio

# 查看端口映射
docker port minio

# 本地测试API端口
curl -I http://127.0.0.1:9000

# 本地测试Console端口
curl -I http://127.0.0.1:9001

# 测试反向代理
curl -I https://s3.example.com/

总结

  1. 后端推荐内网直连127.0.0.1:9000,不走反向代理,速度最快

  1. Console单独一个域名:避免跳转问题

  1. 重建容器时设置MINIO_BROWSER_REDIRECT_URL:根治跳转问题

  1. 删除静态资源location:避免CSS/JS加载失败