Saki's 研究记录

Minio+Nginx 搭建图床

字数统计: 822阅读时长: 3 min
2021/11/11

简介

MinIO是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
本方案要求:有一台有公网IP的服务器,可以是云服务器, 会使用DockerNginx

搭建步骤

创建挂载目录

1
mkdir -p minio/{data,config}

编写 docker-compose.yaml

把里面dataconfig文件夹改成你想要存储数据和配置文件的文件夹,然后把账号密码填进去就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: '3'
services:
minio:
image: minio/minio
hostname: "minio"
ports:
- 9000:9000 # api 端口
- 9001:9001 # 控制台端口
environment:
MINIO_ACCESS_KEY: admin # 管理后台用户名
MINIO_SECRET_KEY: 12345678 # 管理后台密码,最小8个字符
volumes:
- $PWD/data:/data # 映射当前目录下的data目录至容器内/data目录
- $PWD/config:/root/.minio/ # 映射配置目录
- /etc/localtime:/etc/localtime # 时区
command: server --console-address ':9001' /data #指定容器中的目录 /data
privileged: true
restart: always
networks:
- minio-network

networks:
minio-network:
driver: bridge

启动 minio

1
docker-compose up -d 

启动之后,进入容器查看版本:

1
2
3
# docker exec -it minio_minio_1 bash
[root@minio /]# minio -v
minio version RELEASE.2021-11-09T03-21-45Z

打开9000端口之后就可以看到自带的管理界面了。
Minio的存储逻辑很简单,分成多个bucket(桶),没个桶内部就是以文件夹为层级,而且所有文件是直接存储在文件系统上的,没有分成小文件块之类的,因此你可以直接复制到你的data文件夹内。
默认情况下,创建的bucket的权限都是私有的,我们这里选一个名为picsbucket作为公共访问目录(public)。
注意: 一定要配置bucket的指定目录的访问策略为public, 否则预览图片时会报错:

1
This XML file does not appear to have any style information associated with it. The document tree is shown below.

配置 Nginx

没办法直接用链接访问放在Minio中的文件,虽然它提供了分享等功能,但是提供的是一个下载链接,我们需要的是类似于图片预览,因此需要一个Nginx作为文件服务器。
修改nginx配置,增加以下内容:

1
2
3
4
5
6
# 反向代理minIO配置
location /pics {
proxy_set_header Host $host;
add_header Content-Security-Policy "upgrade-insecure-requests";
proxy_pass http://127.0.0.1:9000; # minio
}

重新加载 nginx 配置:

1
nginx -s reload

最后只要向这个桶中上传文件,文件就可以直接通过 Nginx 预览了。
例如:

大文件上传

上传失败

环境搭建完后,上传一个10M的文件失败。一直提示失败,翻查手册发现并未限速。原因是使用了nginx做代理,nginx对上传文件大小有限制,而且默认是1M。
另外,若上传文件很大,还要适当调整上传超时时间。

修改Nginx配置

修改配置,添加client_max_body_size字段:

1
2
3
4
5
6
7
8
9
client_header_timeout    1m;

location /pics {
client_max_body_size 50m; # 文件大小限制, 默认值为1MiB
client_body_timeout 1m;
proxy_set_header Host $host;
add_header Content-Security-Policy "upgrade-insecure-requests";
proxy_pass http://127.0.0.1:9000; # minio
}

重新加载nginx配置:

1
nginx -s reload

Done.

CATALOG
  1. 1. 简介
  2. 2. 搭建步骤
    1. 2.1. 创建挂载目录
    2. 2.2. 编写 docker-compose.yaml
    3. 2.3. 启动 minio
    4. 2.4. 配置 Nginx
  3. 3. 大文件上传
    1. 3.1. 上传失败
    2. 3.2. 修改Nginx配置