当前位置: 代码网 > 服务器>服务器>Linux > nginx代理minio的实现示例

nginx代理minio的实现示例

2025年05月21日 Linux 我要评论
一、nginx的配置(代理minio并支持预签名url)这里是我的项目的整个配置文件server { # 监听的端口 listen 15743; # 监听地址 server_n

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com