docker搭建minio及永久有效链接配置

2,237 阅读5分钟

搭建minio

1. 拉取镜像

docker pull minio/minio

第二版的minio

docker pull minio/minio:RELEASE.2023-02-22T18-23-45Z.fips

2. 启动minio

docker run -p 9000:9000 --name minio -d --restart=always -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=admin123456" -v /usr/local/docker/minio/data:/data -v /usr/local/docker/minio/config:/root/.minio minio/minio server /data --console-address ":9000"

注意:最新版minio,必须加上--console-address ":9000"这个参数

2023-2-22更新,创建容器命令:

docker run -p 9000:9000 -p 9090:9090 --name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=admin" \
-e "MINIO_SECRET_KEY=admin123456" \
-v /data/minio/data:/data \
-v /data/minio/config:/root/.minio \
minio/minio:RELEASE.2023-02-22T18-23-45Z.fips \
server /data --console-address ":9090"

永久链接获取

在生成文件签名链接的时候,可以看到,最长时间长度为7天,但是有时候我们又想要获得一个永久有效的,可访问的链接,那么怎么办呢?

​ 可以通过将某个bucket设置为public或者将某个bucket下的某个目录设置为public,那么我们就可以通过拼接资源路径的方式直接进行访问了,此处建议单独建一个bucket或者单独设置某个目录为public,避免出现安全问题

​ 这个配置是通过mc (minio client)客户端实现的,安装方式见参考二,配置步骤大概如下

1、获取并创建mc容器

docker pull minio/mc
docker run minio/mc ls play

以下操作是进入minio/mc容器进行的

2、添加云存储服务(此处添加了一个名为minio的云存储服务)

这里的minio云服务我选择和我创建的minio的容器名保持一致了

mc config host add minio http://ip:9000 aaaaa bbbb
  • ip:minio容器所在的服务器的IP地址
  • aaaaa 创建的mnio容器的登录名
  • bbbb 创建的minio容器的密码

3、之后,可以通过命令查看某个云存储服务下的文件/bucket等

mc ls minio /展示minio服务下的文件
mc mb minio/test-bucket //在minio里新建桶

更多命令可以查看 docs.min.io/cn/minio-cl…

4、设置桶或者目录的访问权限为public

mc policy set public minio/test-bucket/public      //将minio中,test-bucket存储桶下的
public目录设置为公开可访问
mc policy set public  minio/test-bucket2  //将minio中,test-bucket2存储桶设置为公开可访问

将其设置成公开可访问后,我们可以直接通过拼装地址的方式直接读取到该文件而不需要签名

备注:2023-2-22的minio,不需要单独安装minio/mc去设置存储桶的访问权限。只需要点开存储桶的设置。如下图: image.png image.png

minio版本 image.png

nginx反向代理

minio默认访问接口使用9000端口号,每次都带上端口访问显然不太方便,一般是结合nginx反向代理来访问。这里选择在default.conf添加如下内容:

location /minio {
	#开启自定义错误页面
        proxy_intercept_errors on;
        proxy_connect_timeout 300;
        # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
        #bucket改成你自己的存储桶名称,注意:末尾需要带有一个/
        proxy_pass http://ip:9000/bucket/;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #客户端缓存时间,这里设置为7天,根据自己的需要设置即可
        expires 7d;
        add_header XCDN-Cache "$upstream_cache_status";
        #可以在存储桶事先上传一个html文件或者图片,用作404页面,然后改成存储桶下面的绝对路径,以/开头,如果不需要,可以将其注释
        error_page 404 /404.png;
}

重启nginx后,在浏览器输入https://域名/minio/image_url能看到图片了。如下图: image.png

修改nginx的反向代理

因为要使用https协议进行文件上传,而minio的官方api提供的分片上传功能,给的上传地址还是ip地址格式的,部署到服务器后,前端就会继续报必须使用https协议的错误。如果我按照上面配置的反向代理重写上传地址的话,文件合并的时候,minio就会报403错误。所以综上,我重新配置了minio的反向代理,编辑default.conf,修改如下:

# 后面的/不能没有
location /minio/ {
	#开启自定义错误页面
        proxy_intercept_errors on;
        proxy_connect_timeout 300;
        # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
        #注意:末尾需要带有一个/,否则minio内部会自动重定向至9090登录页,我没有配置域名直接反向代理minio,所以会报404
        proxy_pass http://ip:9000/;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #客户端缓存时间,这里设置为7天,根据自己的需要设置即可
        expires 7d;
        add_header XCDN-Cache "$upstream_cache_status";
        #可以在存储桶事先上传一个html文件或者图片,用作404页面,然后改成存储桶下面的绝对路径,以/开头,如果不需要,可以将其注释
        error_page 404 /404.png;
}

上传资源过大的问题

上传文件的时候,接口会报request entity too large的错误,通过修改Nginx配置文件的“client_max_body_size”属性来解决。nginx的默认配置文件是conf目录下的nginx.conf。
注意:如果有自行扩展的配置文件可在nginx.conf文件中查找include关键字去定位到相应的扩展配置文件。 该属性有三个地方可以配置,不通的地方的作用域不同。

a) 在http节点下(http全局)

http {
   # 将nginx代理的所有请求实体的大小限制为1024m
   client_max_body_size 1024m;
}

b) 在server节点下(server全局)

server {
    # 将该服务下的所有请求实体的大小限制为1024m
    client_max_body_size 1024m;
}

c) 在location节点下(单应用)

location /test {
    # 将此路由请求的实体大小限制为1024m
    client_max_body_size 1024m;
} 

编辑deafult.conf,配置如下:

location /user-management-service {
	proxy_pass https://域名:port/user-management-service;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
	# 将此路由请求的实体大小限制为1024m
        client_max_body_size 1024m;
}

备注:websocket消息体尽量尽量不用传递base64文件

使用nginx反向代理minio控制台

容器创建好后,访问minio的控制台是使用http://ip:9000的方式。 如果希望使用域名的方式访问控制台,可以使用nginx反向代理

进入宿主机的nginx配置文件映射目录:

cd /usr/local/docker/nginx/config/conf.d

新建minio.conf文件,添加如下内容:

# minio控制台的反向代理
 server {
    listen 9080;
    server_name 域名:9080;
 
    # 这里要么直接配置/,后面不添加任何路径名。或者如下proxy_pass的地址最后一定要添加/
    location /file-system {
      proxy_pass http://ip:9000/;
      proxy_set_header Host $http_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-Host $http_host;
      proxy_set_header X-Forwarded-Port $server_port;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
}

这里需要为nginx容器新增一个端口9080,如果是腾讯云轻量服务器,需要去控制台放行。为正在运行的nginx容器新增端口映射我没找到解决办法,我是删掉容器重新创建的,因为nginx配置是留存于宿主机的,所以不需要重新配置了。

docker run --name nginx -d \
-p 80:80 -p 443:443 \
-p 9080:9080 \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html:ro \
-v /usr/local/docker/nginx/logs:/var/log/nginx/:rw \
-v /usr/local/docker/nginx/config/conf.d:/etc/nginx/conf.d:rw \
-v /usr/local/docker/nginx/cert:/etc/nginx/ssl \
-d nginx

重启nginx容器,使用域名:9080/file-system,发现可以自动跳转到minio的控制台了,如下图:

image.png