部署自己的minio对象存储服务 2024-05-20

1. 背景

minio 是一个优秀的开源对象存储服务器软件,如果用 docker 部署会很快。本文介绍采用 内网服务器 进行部署,然后采用 frp 做内网的穿透。外网通过 minio.test.com 这个域名进行访问进入公网服务器 (实际配置以你自己的域名为准)。

2. frp与nginx的共存问题

我们的公网服务器上一定会有 nginx,同时会有一些已经在运行的应用。这时候,假如我们在自己的内网服务器上部署了自己的应用。我们可以通过frp做内网的穿透。

整体的结构关系如下:

nginx与frp关系

3. 公网服务器上的配置

3.1 端口的问题

假如我们的公网服务器购买的是阿里云的服务器,那我们必然不想对外开放很多端口,否则容易受到攻击。如果每次我们在内网服务器开发一个应用,就打开一个端口,那必然会很麻烦,每次都需要去阿里云控制台改变安全策略。

1)frp在公网服务器上的配置

frp 在公网服务器,我们只需要做简单的配置,如下 frps.toml 的配置

bindPort = 9020
vhostHTTPPort = 8090
vhostHttpsPort = 2443

这里 bindPort 是用于 frp 的客户端使用(需要在内网服务器上配置), vhostHTTPPort 对应的是 http 的请求端口,而 vhostHttpsPort 对应的是 https 的端口。

注意:这里如果是阿里云服务器,需要将 9020 端口号打开(阿里云控制台安全策略里修改),仅需要打开这个端口就好。

2)公网服务器nginx的配置

这个时候我们可以让 nginx 按我们的域名进行端口的转发,如下:
可以参考这篇文章 nginx 通过域名代理tcp端口_nginx tcp 域名-CSDN博客

修改 /etc/nginx/nginx.conf 增加

stream {
    map $ssl_preread_server_name $name {
        minio.test.com minio;
        minioapi.test.com minioapi;
    }
    upstream minio{
        server 127.0.0.1:9001;
    }
    upstream minioapi{
        server 127.0.0.1:9000;
    }
}

这样域名来自域名 minio.test.comminioapi.test.com 请求的流量就转发到了 公网服务器 内部的 9001 和 9000两个端口。

注意:这段配置需要放在 nginx.conf 文件里,否则nginx 加载配置时会报如下错误:

2024/05/19 11:18:13 [emerg] 734194#734194: "stream" directive is not allowed here in /etc/nginx/sites-enabled/frps.conf:43

3.2 域名解析的问题

我们在内网服务器 /etc/nginx/sites-enabled 这个目录增加一个 frps.conf的 nginx 配置节点,配置如下:

server {
        listen 80;
        server_name *.test.com;
        location / {
                proxy_set_header   X-Real-IP $remote_addr;
                proxy_set_header   Host      $http_host;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";
                proxy_pass         http://127.0.0.1:8090;
        }
}

server {
    server_name minio.test.com;
    server_tokens off;
    server_name_in_redirect off;

    listen 443 ssl;
    charset utf-8;
    ssl_certificate /home/o.rg_bundle.crt;
    ssl_certificate_key /home/minio..key;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8090;
    }
}

注意点:

  1. 我这里将来源域名配置为 *.test.com,相当于将这个主域名都转发到frp 监听的 8090 ,你可以根据需要配置自己具体的域名。
  2. 对 https 的 ssl证书,ssl_certificatessl_certificate_key 需要改成你自己的证书路径。如果不需要 https,下面那个 server 节点可以不配置。
修改点

这里的 proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade"; 需要加上,否则转发 websocket 协议的时候会报错。参考:https://github.com/fatedier/frp/issues/4080

具体的表现是打开 minio 主界面,然后查看文件列表页面时,会一直转圈。

列表打不开

原因是 ws://minio.test.com 请求会有问题,如果加上了这个 header 配置就正常了。

正常情况

配置完成后需要 reload 下 nginx 的配置 sudo /etc/init.d/nginx reload

4. 内网服务器配置

4.1 minio的 docker 启动

docker run -d -p 9000:9000 -p 9001:9001 \
-e "MINIO_ROOT_USER=admin" -e \ "MINIO_ROOT_PASSWORD=admin123" \ 
-v /Users/mino/miniodata:/data  \
quay.io/minio/minio server /data  --console-address ":9001"

需要注意的点:

  1. root 的用户名和密码是通过环境变量来改,所以这里需要配置 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 这两个环境变量。
  2. 挂载的本机目录可以通过 -v 这个参数处理。这里我将内网服务器的/Users/mino/miniodata 这个目录映射到 docker 容器的 /data的文件目录。这样容器删除后,下次再重新启动文件仍然存在。

4.2 内网服务器上 frp 的配置

配置文件 frpc.minio.toml 的内容如下:

serverPort = 9020
serverAddr = "1.2.3.4"

[[proxies]]
name = "minio"
type = "http"
localPort = 9001
customDomains = ["minio.test.com"]

[[proxies]]
name = "minioapi"
type = "http"
localPort = 9000
customDomains = ["miniapi.test.com"]

注意点:

  1. 这里的 serverPort 保持与公网服务器上 frps.toml 里的端口号一致。
  2. 这里的 serverAddr 填写公网 ip地址。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容