nginx代理minio的實現(xiàn)示例
一、nginx的配置(代理MinIO并支持預(yù)簽名URL)
這里是我的項目的整個配置文件
server { # 監(jiān)聽的端口 listen 15743; # 監(jiān)聽地址 server_name 172.16.49.10; #allow 127.0.0.1; # 設(shè)定本虛擬主機(jī)的訪問與錯誤日志 access_log /home/project/nginx/nginx-access.log; error_log /home/project/nginx/nginx-error.log; # 設(shè)置整個 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小時) * * @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)上找替換掉這個工具類
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的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)nginx代理minio內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx+uwsgi啟動Django項目的詳細(xì)步驟
nginx+uwsgi+django是我們常用的django部署方式。這篇文章主要介紹了nginx+uwsgi啟動Django項目的詳細(xì)步驟,非常具有實用價值,需要的朋友可以參考下2018-10-10zabbix自定義監(jiān)控nginx狀態(tài)實現(xiàn)過程
這篇文章主要為大家介紹了zabbix如何自定義監(jiān)控nginx狀態(tài)的實現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10centos7系統(tǒng)下nginx安裝并配置開機(jī)自啟動操作
這篇文章主要介紹了centos7系統(tǒng)下nginx安裝并配置開機(jī)自啟動操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02Apache和Nginx實現(xiàn)虛擬主機(jī)的3種方式小結(jié)
Apache是一個模型化的服務(wù)器,可以運(yùn)行在幾乎所有的服務(wù)器上。其屬于應(yīng)用服務(wù)器,這篇文章主要介紹了Apache和Nginx實現(xiàn)虛擬主機(jī)的3種方式,需要的朋友可以參考下2023-11-11修改nginx服務(wù)器類型實現(xiàn)簡單偽裝(隱藏nginx類型與版本等)
這篇文章主要介紹了修改nginx服務(wù)器類型實現(xiàn)簡單偽裝(隱藏nginx類型與版本等),需要的朋友可以參考下2016-03-03Nginx代理MySQL實現(xiàn)通過域名連接數(shù)據(jù)庫的詳細(xì)教程
我們的生產(chǎn)環(huán)境基本上都部署在云服務(wù)器上,例如應(yīng)用服務(wù)器、MySQL服務(wù)器等,如果MySQL服務(wù)器直接暴露在公網(wǎng),就會存在很大的風(fēng)險,為了保證數(shù)據(jù)安全,MySQL服務(wù)器的端口是不對外開放的,所以本文介紹了Nginx代理MySQL實現(xiàn)通過域名連接數(shù)據(jù)庫的詳細(xì)教程2024-07-07