1. 背景
minio 是一个优秀的开源对象存储服务器软件,如果用 docker 部署会很快。本文介绍采用 内网服务器 进行部署,然后采用 frp 做内网的穿透。外网通过 minio.test.com 这个域名进行访问进入公网服务器 (实际配置以你自己的域名为准)。
2. frp与nginx的共存问题
我们的公网服务器上一定会有 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.com 和 minioapi.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;
}
}
注意点:
- 我这里将来源域名配置为 *.test.com,相当于将这个主域名都转发到frp 监听的 8090 ,你可以根据需要配置自己具体的域名。
- 对 https 的 ssl证书,ssl_certificate 和 ssl_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"
需要注意的点:
- root 的用户名和密码是通过环境变量来改,所以这里需要配置 MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 这两个环境变量。
- 挂载的本机目录可以通过 -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"]
注意点:
- 这里的 serverPort 保持与公网服务器上 frps.toml 里的端口号一致。
- 这里的 serverAddr 填写公网 ip地址。