缘起
最近感觉OSS比较有意思,然后发现网上有一款开源的软件Minio,算是OSS技术的的开源实现吧,最近玩了一下。想搞一下Https访问,但是Minio官方文档里面实在没看太懂,就想曲线救国,用Nginx转发一下,本次记录做法和期间遇到的问题。
版本
1Nginx 1.16.1 2Minio RELEASE.2021-01-08T21:18:21Z 3Java 1.8u255 4Https 腾讯云申请的ssl证书 5Minio Java客户端版本: 6 <dependency> 7 <groupId>io.minio</groupId> 8 <artifactId>minio</artifactId> 9 <version>8.0.3</version> 10 </dependency>
Nginx配置
上传腾讯云申请的ssl证书文件到服务器,Nginx的话上传解压后的nginx文件夹下的1_xxx.key和2_xxx.crt文件
1server{ 2 listen 443 ssl; 3 server_name xxx.com; 4 ssl_certificate /home/certs/1_xxx.com.crt; 5 ssl_certificate_key /home/certs/2_xxx.com.key; 6 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 7 # 下面这个顺序不要颠倒 8 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 9 ssl_prefer_server_ciphers on; 10 location / { 11 proxy_pass http://localhost:9000; 12 # 下面这三个记得加上 13 proxy_set_header Host $host; 14 proxy_set_header X-Real-IP $remote_addr; 15 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 16 } 17 }
上面配置了Nginx转发,重启Nginx后,https就生效了
Minio配置
下载minio二进制文件,在minio所在的文件夹执行:
./minio server /data
minio默认9000端口,记得不要占用这个端口 其它设置详细见minio文档。
java客户端
封装Minio上传文件方法:
1 @SneakyThrows //lombok的注解 2 public String uploadFile(InputStream inputStream, String bucket, String uploadFileName, String contentType,long size){ 3 MinioClient minioClient = MinioClient.builder() 4 //endpoint是Minio的地址,443是ssl的端口,取决于上面Nginx配置的端口 5 //true是开启ssl连接 6 .endpoint(endPoint,443,true) 7 .credentials(accessKey,accessSecret) 8 .build(); 9 10 minioClient.putObject(PutObjectArgs.builder().bucket(bucket) 11 .object(uploadFileName).stream(inputStream,size,-1).contentType(contentType).build()); 12 13 return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder() 14 .bucket(bucket).object(uploadFileName).method(Method.GET).build()); 15 }
遇到错误:
1request signature we calculated does not match the signature you provided. Check your key and signing method.
是https签名问题,解决此问题的方法是:
- Nginx配置中添加(上面已经给出提示):
1 proxy_set_header Host $host; 2 proxy_set_header X-Real-IP $remote_addr; 3 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- Java客户端添加ssl支持
1MinioClient minioClient = MinioClient.builder() 2 //endpoint是Minio的地址,443是ssl的端口,取决于上面Nginx配置的端口 3 //true是开启ssl连接 4 .endpoint(endPoint,443,true) 5 .credentials(accessKey,accessSecret) 6 .build();
至此,Minio借助Nginx实现Https访问