尽管Minio在文档中明确说明了minio的S3 API并不支持host在subpath下。但如果真的有需求,我们也可以通过修改nginx的反向代理配置来实现这一点。此方法唯一存在的问题是,bucket的名字需要拥有某个共同的前缀。

Minio配置

minio的docker-compose配置如下:

version: '3.6'
services:
  minio:
    image: quay.io/minio/minio:latest
    container_name: minio-ssd-backend
    restart: always
    ports:
      - "39000:9000"
      - "39090:9090"
    volumes:
      - /your-local-data/minio/data:/data
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: change-me
      MINIO_SERVER_URL: https://maindomain.example.com
      MINIO_BROWSER_REDIRECT_URL: https://console.example.com
    command: server /data --console-address=:9090
  • MINIO_SERVER_URL:minio会用这个url来计算签名。
  • MINIO_BROWSER_REDIRECT_URL:console会host在这个url下,如果熟悉mc客户端的话,不需要console也可以进行绝大部分的配置。

Nginx配置

nginx配置可以参考minio的文档。由于我们的maindomain.example.com中可能还有其他的服务,所以我们只需要把带bucket前缀(假设这里的前缀是bucket-prefix)的请求和minio控制的相关请求反向代理给minio即可。具体来说,需要在相应域名的配置中添加以下的两端配置

    # reverse proxy minio api
    # To allow special characters in headers
    location ^~ /minio/ {
        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 Host $http_host;
        client_max_body_size 5000M;

        proxy_connect_timeout 300;
        # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;

        proxy_pass http://localhost:39000; # If you are using docker-compose this would be the hostname i.e. minio
    }
		
		#reverse proxy bucket prefix
    location ^~ /bucket-prefix {
	proxy_hide_header Access-Control-Allow-Origin;
	add_header 'Access-Control-Allow-Origin' '*';
        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 Host $http_host;
        client_max_body_size 5000M;

        proxy_connect_timeout 300;
        # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;

        proxy_pass http://localhost:39000; # If you are using docker-compose this would be the hostname i.e. m>
}

有关console面板的访问

由于console面板会在用户登录时,给minio的MINIO_SERVER_URL//api下POST 请求,如果主网站的相关endpoint已经被其他服务占用,那web面板将无法正常登陆,但我们依然可以用minio的客户端mc进行bucket和文件的操作。

使用mc操作对象存储

将主域名的url作为s3 api配置在minio中即可:

mc alias set minio-s3 https://maindomain.example.com admin password-change-me

如果只是需要往存储桶里上传或下载文件,常见的s3客户端均支持这种配置,只要把s3的域名配置成主域名即可。

多域名

如果希望从其他的域名访问minio,可以在配置其他域名的nginx的时候把proxy_set_header Host $http_host;写死,这里的your-s3-domain.com是minio中配置的s3-api的域名:

proxy_set_header Host your-s3-domain.com;

其他

由于minio后端和mc的User Agent都是已知的(后端是Go-http-client,mc是minio-go,理论上我们也可以根据User Agent将api和根目录页面反代给minio后端。

参考