背景:minio部署到A服务器,由于客户端不能直接访问A服务器,所以只能通过nginx代理的方式,客户端访问B服务器上的nginx,再由nginx代理到minio。
以下是针对Nginx二级目录代理MinIO公有桶和私有桶的最佳实践配置指南,结合生产环境中的常见需求和安全要求,提供可直接部署的方案.
公共桶配置
nginx提供了外网地址,通过二级目录可以代理内网minio的具体桶,将图片展示。minio的桶是公有或者自定义权限,匿名用户可以查看。
配置如下:
server {
listen 8443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
location /public-bucket {
proxy_pass http://minio_ip:9000/hncs-zhujian/;
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;
# 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;
}
}
访问方式:
minio的图片地址是:http://minio_ip:9000/public-bucket/static/test.jpg
那么代理后的访问方式:
https://yourdomain.com:8443/public-bucket/static/test.jpg
私有桶配置
当minio的桶是私有桶时,这时候就需要使用带签名的文件URL进行访问下载,URL大致如下:
内网minio返回的临时图片地址
http://minio_ip:9000/private-bucket/static/test.jpg?
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=admin%20250524T005454%2Fus-east-1%2Fs3%2Faws4_request&
X-Amz-Date=20250524T005454Z&
X-Amz-Expires=12000&
X-Amz-SignedHeaders=host&
X-Amz-Signature=248c0eliuyusnshengsirbf44d485b5fff73abdde90b1a
可以看见一个参数:X-Amz-SignedHeaders=host,也就是说签名和host有关系。
http请求头里面有一个host参数,一般是目标地址IP或域名,但是通过nginx代理之后可能会发生变化,最终导致minio校验签名不通过。
常见报错:
配置
location ^~ /private-bucket/ {
proxy_pass http://minio_ip:9000/private-bucket/;
# 传递客户端原始请求头(关键)
proxy_set_header Host $proxy_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;
# **完整传递所有 S3 签名相关头部**(注意参数名与 URL 中的一致性)
proxy_set_header X-Amz-Algorithm $http_x_amz_algorithm;
proxy_set_header X-Amz-Credential $http_x_amz_credential;
proxy_set_header X-Amz-Date $http_x_amz_date;
proxy_set_header X-Amz-Expires $http_x_amz_expires;
proxy_set_header X-Amz-SignedHeaders $http_x_amz_signedheaders;
proxy_set_header X-Amz-Signature $http_x_amz_signature;
proxy_http_version 1.1;
proxy_set_header Connection "keep-alive"; # 建议保持长连接
proxy_buffering off;
client_max_body_size 0;
}