nginx代理minio的实现示例

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

目录
  • 一、nginx的配置(代理MinIO并支持预签名URL)
  • 二、Java生成预签名URL(Spring Boot示例)
    • 1. 添加依赖(pom.xml)
    • 2.配置类
    • 3. 生成预签名URL的服务类
    • 4. minio工具类
    • 5. 调用示例(Controller)

一、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内容请搜索骃骐网以前的文章或继续浏览下面的相关文章希望大家以后多多支持骃骐网! 

您可能感兴趣的文章:

  • nginx 作为反向代理实现负载均衡的例子
  • Nginx作为反向代理时传递客户端IP的设置方法
  • Nginx反向代理websocket配置实例
  • Nginx实现静态资源的反向代理实例
  • Nginx服务器作反向代理实现内部局域网的url转发配置
  • 通过Nginx代理转发配置实现跨域的方法(API代理转发)
  • Nginx代理后如何获取客户端真实IP地址

相关推荐:

SOAP over FTP可能吗?非HTTP传输示例?

SOAP可通过FTP传输,因其实质为XML文本,但需封装成文件并轮询处理,效率低;而HTTP具备请求-响应模型、状态码、头部元数据、HTTPS加密及广泛工具支持,与SOAP天然契合,故成首选;非HTTP场景下,SMTP适用于异步离线通信,JMS/MQ用于高可靠解耦系统,但均面临缺乏标准响应机制、安全性弱、开发复杂等挑战。 SOAP消息通过FTP传输,从技术上讲是可行的,因为SOAP本质上就是XML...

SOAP消息示例?一个完整请求响应过程?

SOAP请求响应过程始于客户端构造包含操作和参数的XML消息并发送至服务端,服务端解析后执行业务逻辑,再返回包含结果或错误信息的SOAP响应,客户端接收后解析并处理结果或异常。 SOAP消息是基于XML的,用于在分布式环境中交换结构化信息的协议,通常通过HTTP承载。一个完整的SOAP请求响应过程,简单来说,就是客户端按照特定格式构造XML消息发送给服务端,服务端处理后,再以XML消息格式返回结果...

C++文本文件打开 ifstream基本用法示例

C++中使用ifstream打开文本文件需创建对象并检查是否成功打开,常用方法是在构造函数中传入路径或调用open(),随后用is_open()验证状态;读取时推荐getline逐行处理,大文件需关注内存与效率;处理UTF-8等编码时,ifstream仅读取字节流,需确保环境编码一致或借助第三方库转换,避免乱码与字符误判。 C++中,使用ifstream打开文本文件,其核心在于创建ifstream...

SOAP与ESB集成?企业服务总线示例?

ESB通过解耦服务、转换协议与数据格式、动态路由及集中监控,提升SOAP集成的灵活性与可靠性;其在遗留系统整合、B2B交互与数据同步中发挥关键作用,同时需应对WSDL管理、性能瓶颈、安全认证与错误处理等挑战。 企业服务总线(ESB)是集成SOAP服务的常用且高效途径,它充当了不同系统间通信、数据转换和路由的核心枢纽。通过ESB,企业能够更灵活、更可控地管理和连接其基于SOAP的服务,从而实现更深层...

C++函数对象实现 重载operator()示例

函数对象是重载了operator()的类实例,可像函数一样调用,能携带状态且与标准库算法配合实现行为参数化,相比函数指针更灵活安全,适用于需要状态保持或泛型编程的场景。 C++的函数对象,说白了,就是那些重载了 operator() 的类的实例。它们让一个普通的对象,也能像函数一样被调用。在我看来,这是C++一个特别巧妙的设计,它模糊了“数据”和“行为”的界限,让你可以把行为封装进一个对象里,然后...

Spring AI使用tool Calling和MCP的示例详解

SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等场景,通过统一接口降低开发成本,实现如星座运势等复杂功能的灵活集成,本文给大家介绍Spring AI使用tool Calling和MCP的示例,感兴趣的朋友一起看看吧 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结...

移动语义对智能指针影响 std move转移所有权示例

移动语义通过std::move实现智能指针所有权转移,避免拷贝开销;unique_ptr因独占所有权仅支持移动,shared_ptr移动时无需增加引用计数更高效,函数传参时使用std::move可将资源所有权安全移交,提升性能。 移动语义让C++中的资源管理更高效,尤其在智能指针中体现明显。通过std::move,可以将一个智能指针的所有权转移给另一个,避免不必要的拷贝和资源浪费。下面用std::...

MySQL 常用命令示例详解(使用mysql)

本文系统介绍了MySQL常用命令,涵盖数据库管理、数据操作、备份恢复及查询优化,包括启停服务、连接操作、表结构管理、数据增删改查、文件导入导出和性能分析等实用脚本示例 目录一、启停MySQL数据库服务二、连接MySQL数据库三、创建和管理数据库四、创建和管理数据表五、数据备份和恢复六、查询与优化MySQL是一款常用的关系型数据库管理系统,广泛应用于各个领域。在使用MySQL时,我们经常需要编写一些...

JS如何实现代理模式

代理模式通过代理对象控制对目标对象的访问,可在访问前后执行权限控制、缓存、日志等操作。JavaScript中可通过ES6的Proxy对象实现,如拦截get、set操作并转发给目标对象;或通过传统对象模拟,手动定义get、set及方法代理。应用场景包括远程代理、虚拟代理(如图片懒加载)、保护代理、缓存代理和日志代理。ES6 Proxy更强大灵活,适用于现代环境;传统对象模拟则兼容旧环境。代理模式与装...

JS如何实现代理?Proxy的拦截器

javascript中实现代理的核心机制是es6的proxy对象,它通过拦截目标对象的操作实现自定义行为,需传入目标对象和包含get、set、apply等陷阱方法的handler对象,结合reflect确保正确执行默认操作,从而实现如数据校验、响应式系统等高级功能,相比object.defineproperty具有拦截更全面、支持动态属性和数组操作的优势,尽管存在兼容性限制,但已成为现代前端框架如...