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和端口。

java代码层面拼接minio(nginx-ip 或者)公网ip的调用配置可以参考

https://www.jianshu.com/p/e4ee2d2671b6

posted @   邹姣姣  阅读(548)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示