nginx代理minio的实现示例

 更新时间:2025年05月21日 10:48:54   作者:老範吖  
本文介绍通过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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Nginx Location匹配规则的具体使用

    Nginx Location匹配规则的具体使用

    Nginx location指令用于配置请求的处理方式,包括精确匹配、最长前缀匹配、正则表达式匹配等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • 腾讯云服务器记录nginx配置cloudflare证书的实现步骤

    腾讯云服务器记录nginx配置cloudflare证书的实现步骤

    本文主要介绍了腾讯云服务器记录nginx配置cloudflare证书的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • NGINX启用Gzip压缩的实现(优化前端资源加载速度)

    NGINX启用Gzip压缩的实现(优化前端资源加载速度)

    本文分享了通过启用NGINX的Gzip压缩功能来优化前端资源加载速度的实践方案,该方案能有效减少网络传输数据量,是提升Web性能的常用高效手段,感兴趣的可以了解一下
    2026-05-05
  • Nginx搭建负载均衡及常见问题处理

    Nginx搭建负载均衡及常见问题处理

    Nginx作为一款高效的Web服务器和反向代理服务器,广泛应用于负载均衡场景中,本文将详细介绍如何使用Nginx搭建负载均衡,包括基本概念、配置步骤、优化策略及常见问题处理,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • Windows下Nginx的启动停止重启等命令操作过程

    Windows下Nginx的启动停止重启等命令操作过程

    最近在window 上安装了nginx ,对nginx 的操作不是很熟,故在此记录一下常用操作,本文详细介绍了Windows下Nginx的启动,停止,重启等命令,需要的朋友可以参考下
    2024-03-03
  • nginx实现tomcat动静分离详解

    nginx实现tomcat动静分离详解

    本篇文章主要介绍了nginx实现tomcat动静分离详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • nginx日志格式分析以及修改详解

    nginx日志格式分析以及修改详解

    Nginx日志对于统计、系统服务排错很有用,下面这篇文章主要给大家介绍了关于nginx日志格式分析以及修改的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • nginx如何实现配置静态资源服务器及防盗链

    nginx如何实现配置静态资源服务器及防盗链

    这篇文章主要为大家介绍了nginx实现配置静态资源服务器及防盗链步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Nginx报404错误的详细解决方法

    Nginx报404错误的详细解决方法

    最近打开网站看看结果提示:nginx 404 not found,所以这篇文章主要给大家介绍了关于Nginx报404错误的简单解决方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Centos7.x下Nginx安装及SSL配置与常用命令详解

    Centos7.x下Nginx安装及SSL配置与常用命令详解

    这篇文章主要介绍了Centos7.x下Nginx安装及SSL配置与常用命令详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02

最新评论