nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > nginx代理minio

nginx代理minio的实现示例

作者:老範吖

本文介绍通过Nginx代理MinIO实现预签名URL的配置方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、nginx的配置(代理MinIO并支持预签名URL)

这里是我的项目的整个配置文件

server {
    # 监听的端口
    listen 15743;
    # 监听地址
    server_name 172.16.49.10;
    #allow 127.0.0.1;

    # 设定本虚拟主机的访问与错误日志
    access_log /home/project/nginx/nginx-access.log;
    error_log /home/project/nginx/nginx-error.log;

    # 设置整个 server 的最大请求体大小为 10MB
    client_max_body_size 100M;

  location / {
        proxy_pass http://172.16.49.10:8888; # 代理到Java应用的地址和端口
        proxy_set_header Host $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;
    }

	# 文件上传代理路径
	location /minio-upload/ {
		rewrite ^/minio-upload/(.*)$ /$1 break;  # 关键路径重写
		
		proxy_pass http://172.16.49.10:9000;
		
		# 必须透传的请求头
		proxy_set_header Host 172.16.49.10:9000;  # 必须与MinIO服务地址完全一致
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header Authorization $http_authorization;  # 传递签名头
		
		# 支持大文件上传
		client_max_body_size 0;
		
		# 优化代理连接
		proxy_http_version 1.1;
		proxy_connect_timeout 300;
		proxy_read_timeout 300;
		proxy_send_timeout 300;
		chunked_transfer_encoding off;
	}
}

二、Java生成预签名URL(Spring Boot示例)

1. 添加依赖(pom.xml)

<!-- Minio 文件存储 -->
<dependency>
	<groupId>io.minio</groupId>
	<artifactId>minio</artifactId>
	<version>8.2.1</version>
</dependency>

2.配置类

配置信息(application.yml)

minio:
  url: http://172.16.49.10:9000
  accessKey: minioadmin
  secretKey: minioadmin
import io.minio.MinioClient;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/**
 * Minio 配置信息
 */
@Slf4j
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig
{
    /**
     * 服务地址
     */
    private String url;

    /**
     * 用户名
     */
    private String accessKey;

    /**
     * 密码
     */
    private String secretKey;

    @Bean
    public MinioClient getMinioClient()
    {
        log.info("连接MinioClient");
        return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
    }
}

3. 生成预签名URL的服务类

import io.minio.GetPresignedObjectUrlArgs;
import io.minio.MinioClient;
import io.minio.http.Method;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Service
public class MinioService
{
    @Resource
    private MinioClient minioClient;

    @Resource
    private MinioTemplate minioTemplate;

    /**
     * 生成PUT方法预签名URL(有效期1小时)
     *
     * @param bucket 存储桶名称
     * @param object 对象路径(如:uploads/device1/20240326.zip)
     */
    public String generateUploadUrl(String bucket, String object)
    {
        try
        {
            minioTemplate.existBucket(bucket);
            String string = minioClient.getPresignedObjectUrl(
                    GetPresignedObjectUrlArgs.builder()
                            .method(Method.PUT)
                            .bucket(bucket)
                            .object(object)
                            .expiry(1, TimeUnit.HOURS)
                            .build()
            );

            // 替换为Nginx代理地址
            return string.replace("http://172.16.49.10:9000", "http://172.16.49.10:15743/minio-upload");
        } catch (Exception e)
        {
            throw new RuntimeException("生成预签名URL失败", e);
        }
    }
}

4. minio工具类

我只需要判断桶存在。其他方法可以从网上找替换掉这个工具类

import io.minio.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;


@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class MinioTemplate
{

    @Resource
    private MinioClient minioClient;


    /**
     * 判断桶是否存在,如果存在返回true,如果不存在返回false
     *
     * @param bucketName
     * @return
     */
    @SneakyThrows
    public Boolean existBucket(String bucketName)
    {
        boolean exist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        if (!exist)
        {
            makeBucket(bucketName);
        }
        return true;

    }

    /**
     * 创建桶
     *
     * @param bucketName
     * @return
     */
    @SneakyThrows
    public void makeBucket(String bucketName)
    {
        minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
    }
}

5. 调用示例(Controller)

@RestController
@RequestMapping("/api")
public class FileController {
    
    @Autowired
    private MinioService minioService;
​
    @GetMapping("/presigned-url")
    public ResponseEntity<String> getPresignedUrl(@RequestParam String bucket, @RequestParam String objectPath) {
        String url = minioService.generateUploadUrl(bucket, objectPath);
        return ResponseEntity.ok(url);
    }
}

我的后端端口使用nginx代理15743,获取预签名URL:

GET
http://172.16.49.10:15743/api/presigned-url?bucket=12312&objectPath=121211.txt

在这里插入图片描述

上传文件:根据返回的URL,直接调用

PUT
http://172.16.49.10:15743/minio-upload/12312/121211.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20250326%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250326T064808Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2633bb91c9bc9094fd10570e023ca990395b85f912a8cbd3d31a36904124265a

在这里插入图片描述

到此这篇关于nginx代理minio的实现示例的文章就介绍到这了,更多相关nginx代理minio内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文