nginx二级目录代理minio公有桶和私有桶配置区别
nginx二级目录代理minio公有桶和私有桶配置区别
背景:minio部署到A服务器,由于客户端不能直接访问A服务器,所以只能通过nginx代理的方式,客户端访问B服务器上的nginx,再由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 /hncs-zhujian/ {
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/hncs-zhujian/static/house_default_1729816061370.jpg
那么代理后的访问方式:
https://yourdomain.com:8443/hncs-zhujian/static/house_default_1729816061370.jpg
私有桶
当minio的桶是私有桶时,这时候就需要使用带签名的文件URL进行访问下载,URL大致如下:
- 内网minio返回的临时图片地址
http://172.19.86.195:9000/jggz-info/2024/12/13/20241213085454A002.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20241213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241213T005454Z&X-Amz-Expires=12000&X-Amz-SignedHeaders=host&X-Amz-Signature=248c0e9af2f378ab3902ca8b89ca6a38ae59112bf44d485b5fff73abdde90b1a
可以看见一个参数:X-Amz-SignedHeaders=host,也就是说签名和host有关系。
http请求头里面有一个host参数,一般是目标地址IP或域名,但是通过nginx代理之后可能会发生变化,最终导致minio校验签名不通过。
常见报错:
解决办法:
在nginx的代理配置中添加如下配置即可:
proxy_set_header Host $proxy_host;
注意是proxy_host
nginx代理的全部配置是:
location /jggz-info/{
proxy_pass http://172.19.86.195:9000/jggz-info/;
#proxy_set_header Host $http_host; #使用这条则代理后校验签名会被拒绝。
proxy_set_header Host $proxy_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;
# 确保传递与签名验证相关的头部
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 "";
proxy_buffering off;
client_max_body_size 0;
}
- 改好后 图片的nginx转发前地址
http://公网ip:8070/jggz-info/2024/12/17/20241217110231A004.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20241217%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241217T030231Z&X-Amz-Expires=12000&X-Amz-SignedHeaders=host&X-Amz-Signature=037e087348d7b5f918cd722a1734f837060b9f9ac08c0ee7fd8165e624e6beeb
这里对nginx的proxy_set_header $proxy_host进行一个详细说明
- proxy_set_header Host $proxy_host;
这行配置是在使用Nginx作为反向代理服务器时,用于设置请求头(Header)中Host字段的值。这里,$proxy_host是一个变量,它包含了代理目标的主机名和端口号(如果指定了端口号的话)。
具体来说:
-
proxy_set_header:这是一个指令,用于定义要传递给后端服务器的请求头。
-
Host:这是HTTP请求中的一个标准字段,通常用于指定请求的目标主机名和端口号。在反向代理的场景中,原始请求的Host字段可能指向的是代理服务器(Nginx)的地址,而我们需要将请求转发给后端服务器时,保持或修改这个Host字段的值,以便后端服务器能够正确处理请求。
-
$proxy_host:这是Nginx中的一个变量,它根据proxy_pass指令指定的目标地址动态地获取主机名和端口号。如果proxy_pass指向的是proxy_pass http://172.19.86.195/jggz-info/,那么$proxy_host的值就是172.19.86.195。如果指定了端口号,比如http://172.19.86.195:9000,那么$proxy_host的值就是172.19.86.195:9000。
-
使用proxy_set_header Host $proxy_host;这条配置的目的是为了确保后端服务器接收到的请求中Host字段的值是后端服务器自己的主机名和端口号,这对于后端服务器正确解析请求、进行虚拟主机处理、生成正确的重定向URL等是非常重要的。
总之,这行配置在Nginx作为反向代理时非常有用,它帮助确保后端服务器能够接收到正确的Host信息,从而正确处理请求。
nginx代理minio集群的私有桶
注意,nginx的配置中,需要配置真正能share出来的ip和端口。
在minio的两个节点都执行查看私有桶share,检查share出来的ip和端口。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)