尽管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后端。