nginx代理minio的實(shí)現(xiàn)示例
一、nginx的配置(代理MinIO并支持預(yù)簽名URL)
這里是我的項(xiàng)目的整個(gè)配置文件
server {
# 監(jiān)聽的端口
listen 15743;
# 監(jiān)聽地址
server_name 172.16.49.10;
#allow 127.0.0.1;
# 設(shè)定本虛擬主機(jī)的訪問與錯(cuò)誤日志
access_log /home/project/nginx/nginx-access.log;
error_log /home/project/nginx/nginx-error.log;
# 設(shè)置整個(gè) server 的最大請求體大小為 10MB
client_max_body_size 100M;
location / {
proxy_pass http://172.16.49.10:8888; # 代理到Java應(yīng)用的地址和端口
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; # 關(guān)鍵路徑重寫
proxy_pass http://172.16.49.10:9000;
# 必須透傳的請求頭
proxy_set_header Host 172.16.49.10:9000; # 必須與MinIO服務(wù)地址完全一致
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;
# 優(yōu)化代理連接
proxy_http_version 1.1;
proxy_connect_timeout 300;
proxy_read_timeout 300;
proxy_send_timeout 300;
chunked_transfer_encoding off;
}
}
二、Java生成預(yù)簽名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
{
/**
* 服務(wù)地址
*/
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. 生成預(yù)簽名URL的服務(wù)類
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方法預(yù)簽名URL(有效期1小時(shí))
*
* @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("生成預(yù)簽名URL失敗", e);
}
}
}
4. minio工具類
我只需要判斷桶存在。其他方法可以從網(wǎng)上找替換掉這個(gè)工具類
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;
}
/**
* 創(chuàng)建桶
*
* @param bucketName
* @return
*/
@SneakyThrows
public void makeBucket(String bucketName)
{
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
}
5. 調(diào)用示例(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,獲取預(yù)簽名URL:
GET
http://172.16.49.10:15743/api/presigned-url?bucket=12312&objectPath=121211.txt

上傳文件:根據(jù)返回的URL,直接調(diào)用
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

到此這篇關(guān)于nginx代理minio的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)nginx代理minio內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx+uwsgi啟動Django項(xiàng)目的詳細(xì)步驟
nginx+uwsgi+django是我們常用的django部署方式。這篇文章主要介紹了nginx+uwsgi啟動Django項(xiàng)目的詳細(xì)步驟,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
zabbix自定義監(jiān)控nginx狀態(tài)實(shí)現(xiàn)過程
這篇文章主要為大家介紹了zabbix如何自定義監(jiān)控nginx狀態(tài)的實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
centos7系統(tǒng)下nginx安裝并配置開機(jī)自啟動操作
這篇文章主要介紹了centos7系統(tǒng)下nginx安裝并配置開機(jī)自啟動操作方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Nginx層面配置基礎(chǔ)用戶驗(yàn)證的完整步驟
這篇文章主要給大家介紹了關(guān)于Nginx層面配置基礎(chǔ)用戶驗(yàn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Nginx具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Apache和Nginx實(shí)現(xiàn)虛擬主機(jī)的3種方式小結(jié)
Apache是一個(gè)模型化的服務(wù)器,可以運(yùn)行在幾乎所有的服務(wù)器上。其屬于應(yīng)用服務(wù)器,這篇文章主要介紹了Apache和Nginx實(shí)現(xiàn)虛擬主機(jī)的3種方式,需要的朋友可以參考下2023-11-11
修改nginx服務(wù)器類型實(shí)現(xiàn)簡單偽裝(隱藏nginx類型與版本等)
這篇文章主要介紹了修改nginx服務(wù)器類型實(shí)現(xiàn)簡單偽裝(隱藏nginx類型與版本等),需要的朋友可以參考下2016-03-03
Nginx代理MySQL實(shí)現(xiàn)通過域名連接數(shù)據(jù)庫的詳細(xì)教程
我們的生產(chǎn)環(huán)境基本上都部署在云服務(wù)器上,例如應(yīng)用服務(wù)器、MySQL服務(wù)器等,如果MySQL服務(wù)器直接暴露在公網(wǎng),就會存在很大的風(fēng)險(xiǎn),為了保證數(shù)據(jù)安全,MySQL服務(wù)器的端口是不對外開放的,所以本文介紹了Nginx代理MySQL實(shí)現(xiàn)通過域名連接數(shù)據(jù)庫的詳細(xì)教程2024-07-07

