使用Nginx代理MinIO的完整指南:实现Web界面与API接口的远程访问
本文介绍了使用Nginx代理MinIO对象存储的完整方案。MinIO是一款兼容Amazon S3 API的高性能对象存储服务器,适用于云环境部署。针对内网部署需要外网访问的场景,文章详细讲解了Nginx代理配置,包括API接口(9000端口)和Web界面(9001端口)的代理设置,重点解决了WebSocket连接、静态资源路径修正(sub_filter)等关键问题。同时提供了常见问题解决方法,如s
一、什么是Minio?
1.1、简介
Minio是一个高性能的对象存储服务器,用于构建云存储解决方案。它使用GoLang编写,专为私有云、公有云和混合云环境设计。它兼容Amazon S3 API,并可以作为一个独立的存储后端或与其他流行的开源解决方案(如Kubernetes)集成。
1.2、MinIO的核心特点:
- 存储非结构化数据(视频、文件、图片等)以对象形式;
- 相比传统文件系统(如NFS)和块存储(如ISCSI)更易于扩展和管理;
- 提供简单的部署选项和只管的Web界面;
- 支持快速设置和访问存储资源
更多有关minio的详细介绍,可参考minio官方网站。
二、为什么需要Nginx代理MinIO
本教程,主要用来介绍使用Nginx代理minio。为什么会出一期使用Nginx代理minio这个流程呢?作者键盘侠Gu在实际的部署项目,遇到了minio和后端服务都部署在内网环境下,但是需要在外网环境下进行访问部署,而且服务器是Linux环境,没有图形化界面,虽然也能够对minio的桶以及密钥进行配置,但是相对来说比较繁琐。因此想到了能否使用Nginx将minio的Web界面地址及Api接口地址进行代理出来,在网上也检索了一些方法,要么笼统发布,要么给的方法不行。经过反复研究,最终成功实现了Nginx代理minio的图形化Web界面及Api接口。
三、完整代理配置方案
3.1 基础环境准备
- 已安装MinIO并正常运行(默认Web端口9001,API端口9000);
- 已安装Nginx。
3.2 Nginx配置详解
server {
listen 8083;
server_name localhost;
# api接口
location /minio-api/ {
proxy_pass http://192.168.0.25:9000/;
proxy_http_version 1.1;
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;
proxy_buffering off;
tcp_nodelay on;
}
#web界面
location /minio-web/ {
rewrite ^/minio-web/(.*) /$1 break;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
#real_ip_header X-Real-IP;
proxy_connect_timeout 300;
# 支持WebSocket(2023年1月后MinIO版本需要)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
chunked_transfer_encoding off;
proxy_pass http://192.168.0.25:9001/;
sub_filter '<base href="/"/>' '<base href="/minio-web/"/>';
}
}
需要注意的是,代理Web界面时,如果出现图片加载不出来的情况下,必须要配置“sub_filter”。
3.3 关键配置说明:
1 路径处理:
- API接口:通过/minio-api/前缀代理到API端口(9000);
- Web界面:通过/minio-web/前缀代理到MinIO的Web端口(9001)。
2 WebSocket支持:
- 新版MinIO需要WebSocket连接,必须配置Upgrade和COnnection头。
3 静态资源修正
- 使用sub_filter修正HTML种的基础路径,确保资源加载正确。
四、常见问题及解决方案
4.1 sub_filter无法工作("unknown directive 'sub_filter'")
原因分析:
- 模块未加载:sub_filter功能需要ngx_http_sub_module模块支持,可能在编译时未包含此模块;
- 配置语法变化:新版本可能对语法有细微调整;
- 与其他模块冲突:某些过滤类模块可能优先级冲突;
解决方案:
方法1:重新编译Nginx包含sub模块
# 检查当前Nginx是否包含sub模块
nginx -V 2>&1 | grep -o http_sub_module
# 重新编译(在Nginx源码目录)
./configure --with-http_sub_module
make
sudo make install
方法2:安装扩展版本(快速解决)
- 对于Ubuntu/Debian:
sudo apt-get install nginx-extras
- 对于CentOS/RHEL:
sudo yum install nginx-plus-module-subs-filter
验证配置:
nginx -t
nginx -s reload
4.2 图片/静态资源加载失败
-
确保sub_filter配置正确;
-
检查路径重写规则;
-
确认代理头信息完整。
4.3 WebSocket连接问题
- 确认已配置Upgrade和Connection头;
- 检查防火墙设置;
- 验证Nginx版本支持WebSocket代理
五、最佳实践建议
-
安全加固:
-
为代理路径添加HTTP Basic认证
-
配置SSL/TLS加密
-
限制访问IP范围
-
-
性能优化:
-
启用gzip压缩
-
调整缓冲区大小
-
配置合理的超时时间
-
-
路径设计原则:
-
保持API和Web路径前缀一致(如都使用
/minio/) -
路径结尾的
/必须正确配置 -
避免路径冲突
-
-
混合环境配置:
-
后端服务直接使用MinIO原始地址(内网通信)
-
前端使用代理地址(外网访问)
-
预览地址统一使用代理地址
-
六、总结
通过Nginx代理MinIO可以有效解决内外网访问问题,同时提供更好的安全性和可管理性。关键点在于:
- 在配置是,web界面,可以直接通过代理的地址进行访问;
- Api接口,如果我们配置的后端服务可以直接与minio建立通信,那么就我们在配置OSS上传时,api地址需要配置代理之前的地址,也就是原地址,而我们的预览地址,需要配置代理之后的地址,否则会导致不可以预览。
- 在配置location时,我们需要注意的是,请求前缀的前面和后面都必须要加上“/”,否则会导致代理失败。
这种方案特别适合无GUI的Linux服务器环境,可以显著简化MinIO的管理和维护工作。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)