一、什么是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代理

五、最佳实践建议

  1. 安全加固

    • 为代理路径添加HTTP Basic认证

    • 配置SSL/TLS加密

    • 限制访问IP范围

  2. 性能优化

    • 启用gzip压缩

    • 调整缓冲区大小

    • 配置合理的超时时间

  3. 路径设计原则

    • 保持API和Web路径前缀一致(如都使用/minio/

    • 路径结尾的/必须正确配置

    • 避免路径冲突

  4. 混合环境配置

    • 后端服务直接使用MinIO原始地址(内网通信)

    • 前端使用代理地址(外网访问)

    • 预览地址统一使用代理地址

六、总结

通过Nginx代理MinIO可以有效解决内外网访问问题,同时提供更好的安全性和可管理性。关键点在于:

  • 在配置是,web界面,可以直接通过代理的地址进行访问;
  • Api接口,如果我们配置的后端服务可以直接与minio建立通信,那么就我们在配置OSS上传时,api地址需要配置代理之前的地址,也就是原地址,而我们的预览地址,需要配置代理之后的地址,否则会导致不可以预览。
  • 在配置location时,我们需要注意的是,请求前缀的前面和后面都必须要加上“/”,否则会导致代理失败。

这种方案特别适合无GUI的Linux服务器环境,可以显著简化MinIO的管理和维护工作。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐