Nginx负载均衡配置Minio避免踩坑

前言

前面咱们介绍了Minio和Nginx

Minio负载均衡配置

直接上nginx.conf配置吧

upstream minio {   ip_hash;   server 192.168.124.241:9001;   server 192.168.124.241:9002;   server 192.168.124.241:9003;   server 192.168.124.241:9004; } server {   listen       9999;   server_name  localhost;    ignore_invalid_headers off;   client_max_body_size 0;   proxy_buffering off;    location / {       # proxy_set_header   Host $http_host;     proxy_set_header   X-Real-IP $remote_addr;     proxy_set_header   X-Forwarded-Host  $host:$server_port;     proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;     proxy_set_header   X-Forwarded-Proto  $http_x_forwarded_proto;     client_body_buffer_size 10M;     client_max_body_size 10G;     proxy_buffers 1024 4k;     proxy_read_timeout 300;     proxy_next_upstream error timeout http_404;     # Default is HTTP/1, keepalive is only enabled in HTTP/1.1     proxy_http_version 1.1;     proxy_set_header Connection "";      proxy_pass http://minio;   } }

细心的小伙伴可以发现,前面的Nginx总结中有上面的配置,哈哈

SignatureDoesNotMatch

开开心心地搞到最后了,本以为大功告成,却偏偏报错了(关键配置上面都注释了),emmmm…………

minIO Docker 使用Nginx代理后出现:

minio.error.SignatureDoesNotMatchSignatureDoesNotMatch:The request signature we calculated does not match the signature you provided

Nginx负载均衡配置Minio避免踩坑

心态崩了.....使用可视化客户端上传删除什么都没有问题,偏偏使用API的时候报错了

查了一下发现是这样的:

签名不正确,后来发现和nginx反向代理在做转发的时候所携带的header有关系.

minio在校验signature是否有效的时候,必须从http header里面获取host,而我们这里没有对header作必要的处理.如果源请求未携带这个头,则minio处无法获取请求头中的host,目前我这里测试看请求有携带Host,这里的机制问题出在nginx,nginx没有把这个host转发过去,而用ip的时候Host为 ip:port,这种情况是正常的,这应该和nginx的默认配置proxy_set_header Host $http_host有关系

如果不想改变请求头“Host”的值,可以这样来设置:
proxy_set_header Host httphost;但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,更好的方式是使用httphost;但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,更好的方式是使用host变量——它的值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名:

我们这里的nginx.conf需要添加下面代码

proxy_set_header Host $host;

$host代表的是当前虚拟主机的host,即上面配置的oss.allcmem.com

配置了host后还是相同的错误.....

Nginx负载均衡配置Minio避免踩坑

查了一下,发现原来Nginx使用的默认连接方式是HTTP/1......

添加配置:

# Default is HTTP/1, keepalive is only enabled in HTTP/1.1 proxy_http_version 1.1;

果然,上传文件没有问题了.终于解决了

更详细的配置大家参考官网:https://docs.min.io/docs/setup-nginx-proxy-with-minio.html

您可能还会对下面的文章感兴趣: