Host the MinIO Server API on a subpath and Configure Multi Domain

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

Minio配置

minio的docker-compose配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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即可。具体来说,需要在相应域名的配置中添加以下的两端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    # 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中即可:

1
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的域名:

1
proxy_set_header Host your-s3-domain.com;

其他

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

参考

  • https://min.io/docs/minio/linux/reference/minio-server/settings/core.html#domain
  • https://min.io/docs/minio/linux/integrations/setup-nginx-proxy-with-minio.html
  • https://github.com/minio/minio/discussions/18134
  • https://github.com/minio/minio/discussions/14077