不看后悔一辈子的MINIO配置文档(内含NGINX反向代理配置文件)

MINIO本地OSS部署及配置

单节点部署

下载 MinIO 服务器

root@minio:~# cd /opt/
root@minio:/opt# wget https://dl.min.io/server/minio/release/linux-amd64/minio
--2024-05-21 14:04:48--  https://dl.min.io/server/minio/release/linux-amd64/minio
Resolving dl.min.io (dl.min.io)... 138.68.11.125, 178.128.69.202
Connecting to dl.min.io (dl.min.io)|138.68.11.125|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 102985880 (98M) [application/octet-stream]
Saving to: 'minio'

minio                                                100%[====================================================================================================================>]  98.21M  5.33MB/s    in 25s

2024-05-21 14:05:46 (3.95 MB/s) - 'minio' saved [102985880/102985880]

root@minio:/opt# chmod +x minio
root@minio:/opt# mv minio /usr/bin/
root@minio:/opt# whereis minio
minio: /usr/bin/minio

创建数据存储目录(这里我使用的是NAS,所以要先将网络磁盘挂载到服务器上)

root@minio:/opt# cd /
root@minio:/# mkdir minio
root@minio:/opt# mount IP:/minio/ /minio/
#持久化挂载
root@minio:/# echo "IP:/minio  /minio  nfs4  defaults  0  0" >> /etc/fstab
root@minio:/# mount -a

创建环境变量文件

root@minio:/# cat /etc/default/minio
# MINIO_ROOT_USER and MINIO_ROOT_PASSWORD sets the root account for the MinIO server.
# This user has unrestricted permissions to perform S3 and administrative API operations on any resource in the deployment.
# Omit to use the default values 'minioadmin:minioadmin'.
# MinIO recommends setting non-default values as a best practice, regardless of environment

MINIO_ROOT_USER=username
MINIO_ROOT_PASSWORD='passwd'

# MINIO_VOLUMES sets the storage volume or path to use for the MinIO server.

MINIO_VOLUMES="/minio"

# MINIO_OPTS sets any additional commandline options to pass to the MinIO server.
# For example, `--console-address :9001` sets the MinIO Console listen port
MINIO_OPTS="--console-address :9001"

# MINIO_SERVER_URL sets the hostname of the local machine for use with the MinIO Server
# MinIO assumes your network control plane can correctly resolve this hostname to the local machine

# Uncomment the following line and replace the value with the correct hostname for the local machine and port for the MinIO server (9000 by default).

MINIO_BROWSER_REDIRECT_URL="https://域名/minio/ui"

使用systemctl接管服务

root@minio:/# cat /usr/lib/systemd/system/minio.service
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/bin/minio

[Service]
WorkingDirectory=/minio   #这里更改了数据存储目录

User=root
Group=root
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# MinIO RELEASE.2023-05-04T21-44-30Z adds support for Type=notify (https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=)
# This may improve systemctl setups where other services use `After=minio.server`
# Uncomment the line to enable the functionality
# Type=notify

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})

root@minio:/# systemctl daemon-reload
root@minio:/# systemctl start minio.service

使用nginx反向代理出接口和控制台

多目录代理配置

[root@minio:/usr/local/nginx/conf/vhost]# cat minio.conf
server {
    listen 443 ssl;
    server_name 域名;
    index index.html index.htm index.php default.html default.htm default.php;

    ssl_certificate  SLL证书.pem;
    ssl_certificate_key SSL证书.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE:!3DES;
	ssl_prefer_server_ciphers on;

	ignore_invalid_headers off;
	client_max_body_size 0;
	proxy_buffering off;
	proxy_request_buffering off;
    
	location / {
		root   ******;
		try_files $uri $uri/ /index.php$is_args$args;
    }
    
    location  /tomcat/  { proxy_pass  http://127.0.0.1:8080/; }
  
#S3 API签名计算算法不支持托管MinIO Server API的代理方案,例如.example.net/s3/。所以这里使用 ^~ 表示前缀匹配,即任何以 /minio- 开头的请求都会被这个位置块处理。
#注意:在创建Buckets时要加上minio-前缀,例如:minio-testoss。
	location ^~ /minio- {
		proxy_set_header Host $http_host;
		proxy_pass http://127.0.0.1:9000; 
		proxy_pass_request_headers on;
		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_connect_timeout 5;
   }

	location /minio/ui/ {
		rewrite ^/minio/ui/(.*) /$1 break;
		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-Proto $scheme;
		proxy_set_header X-NginX-Proxy true;
		real_ip_header X-Real-IP;
		proxy_connect_timeout 300;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";
		chunked_transfer_encoding off;
		proxy_pass http://127.0.0.1:9001/; 
	}

	access_log  /home/wwwlogs/minio.log;
}

单目录代理配置

[root@minio:/usr/local/nginx/conf/vhost]# cat minio.conf
server {
    listen 443 ssl;
    server_name 域名;
    index index.html index.htm index.php default.html default.htm default.php;

    ssl_certificate  SLL证书.pem;
    ssl_certificate_key SSL证书.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE:!3DES;
	ssl_prefer_server_ciphers on;

	ignore_invalid_headers off;
	client_max_body_size 0;
	proxy_buffering off;
	proxy_request_buffering off;

	location / {
		proxy_set_header Host $http_host;
		proxy_pass http://127.0.0.1:9000; 
		proxy_pass_request_headers on;
   }

	location /minio/ui/ {
		rewrite ^/minio/ui/(.*) /$1 break;
		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-Proto $scheme;
		proxy_set_header X-NginX-Proxy true;
		real_ip_header X-Real-IP;
		proxy_connect_timeout 300;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";
		chunked_transfer_encoding off;
		proxy_pass http://127.0.0.1:9001/; 
	}

	access_log  /home/wwwlogs/minio.log;
}

创建Buckets时的一些问题

Versioning allows to keep multiple versions of the same object under the same key.

Minio 的版本控制功能允许在同一个键下保留同一个对象的多个版本。以下是这个功能的具体含义:
1. 多个版本:启用版本控制后,每次你上传一个新的对象版本(文件)时,即使键(名称)相同,Minio 会保留之前的版本,而不是覆盖它们。这使你可以保持该对象的更改历史。
2. 相同键:键实际上是存储系统中对象的名称或标识符。尽管键相同,每个版本的对象都有一个唯一的版本 ID。
3. 数据恢复:版本控制允许你在意外删除或修改对象时恢复之前的版本。你可以根据需要检索、还原或删除特定版本的对象。
4. 冲突解决:如果多个客户端同时上传具有相同键的对象,版本控制通过存储每次上传的不同版本来管理冲突。

示例场景

#假设你在 Minio 中存储了一个名为 `report.pdf` 的文档。启用版本控制后:
- 周一,你上传了 `report.pdf`,这是版本 1。
- 周二,你对其进行了一些更改并再次上传 `report.pdf`,这是版本 2。
- 周三,你又进行了更多的更改并再次上传 `report.pdf`,这是版本 3#所有这些版本都存储在键 `report.pdf` 下,但你可以在需要时访问任何之前的版本。

好处

- 防止意外数据丢失:如果你不小心删除或覆盖了对象,可以恢复之前的版本。
- 变更跟踪:你可以随时跟踪对象的更改,对于审计和历史参考非常有用。
- 测试和开发:开发人员可以使用版本控制来测试更改,而不会丢失之前的数据版本。

如何启用版本控制

要在 Minio 中启用版本控制,通常需要使用 Minio 客户端(mc)或通过 Minio 控制台进行配置。以下是使用 Minio 客户端的基本示例:
mc mb myminio/mybucket
mc version enable myminio/mybucket
#这将在你的 Minio 服务器实例 `myminio` 中的 `mybucket` 存储桶上启用版本控制。

Object Locking prevents objects from being deleted. Required to support retention and legal hold. Can only be enabled at bucket creation.

Minio 的对象锁定(Object Locking)功能可以防止对象被删除。以下是这个功能的具体含义和操作:
1. 防止删除:对象锁定确保在指定的保留期内,任何人都不能删除对象。这对于需要长时间保存数据的情况特别有用。
2. 保留和法律保留支持:对象锁定功能支持数据保留策略和法律保留要求。保留策略可以防止在特定时间之前删除对象,而法律保留则用于符合法律和合规要求,确保数据在法律要求的时间内不能被删除。
3. 仅在存储桶创建时启用:对象锁定功能只能在创建存储桶时启用,不能在存储桶已经存在时再启用。

示例场景

#假设你有一个存储桶 `mybucket`,并希望确保其中的对象在未来三年内不能被删除以满足合规要求:
- 创建存储桶并启用对象锁定:
  mc mb --with-lock myminio/mybucket
  #这将创建一个名为 `mybucket` 的存储桶,并启用对象锁定功能。
- 设置保留策略:
  你可以使用 Minio 客户端来设置对象的保留策略,例如设置一个对象的保留期限为三年:
  mc retention set myminio/mybucket/myobject Governance 3y
  #这表示对象 `myobject` 在接下来的三年内不能被删除或覆盖。  
- 设置法律保留:
  如果某个对象需要法律保留,你可以这样设置:
  mc legalhold set myminio/mybucket/myobject on
  #这将对 `myobject` 启用法律保留,防止任何形式的删除操作。

好处

1. 合规性存储:金融、医疗等行业需要长期保留数据,确保数据不可篡改和删除。
2. 审计和调查:确保在审计期间或法律调查期间数据不会被删除或修改。
3. 数据保护:防止关键数据在特定时间段内被意外或恶意删除。

Quota limits the amount of data in the bucket.

Minio 的配额(Quota)功能允许限制存储桶中数据的总量。以下是这一功能的具体含义和操作:
1. 数据限制:配额功能允许你为每个存储桶设置一个数据容量上限。这样可以控制每个存储桶可以存储的数据量,防止存储空间被意外占满。
2. 管理资源:通过设置配额,可以有效管理存储资源,确保不同的用户或应用程序不会超出分配的存储空间。

示例场景

#假设你有一个存储桶 `mybucket`,并希望限制其存储数据的总量为 100 GB:
- 设置存储桶配额:
  使用 Minio 客户端来设置存储桶的配额。例如,限制存储桶 `mybucket` 的存储量为 100 GB:
  mc admin bucket quota set myminio/mybucket --size 100GB
  #这表示 `mybucket` 中的总数据量不能超过 100 GB。

适用场景

1. 资源控制:确保每个用户或应用程序只能使用预定的存储空间,防止资源滥用。
2. 成本管理:控制存储成本,通过限制存储空间来避免不必要的数据存储费用。
3. 数据治理:管理和优化存储资源,确保系统的高效运行。

Retention imposes rules to prevent object deletion for a period of time. Versioning must be enabled in order to set bucket retention policies.

Minio 的保留(Retention)功能通过设置规则,在特定时间段内防止对象删除。以下是这个功能的具体含义和操作:
1. 防止对象删除:保留功能确保在设定的保留期内,对象不能被删除或覆盖。这对于数据保护和合规性要求非常有用。
2. 规则设置:你可以为存储桶中的对象设置保留策略,指定对象在多长时间内不能被删除。
3. 版本控制要求:要使用保留功能,必须启用版本控制。这是因为保留策略通常需要对对象的不同版本进行管理和保护。

示例场景

#假设你有一个存储桶 `mybucket`,并希望其中的对象在三年内不能被删除:
1. 启用版本控制:
   首先,确保你的存储桶启用了版本控制:
   mc mb myminio/mybucket
   mc version enable myminio/mybucket
2. 设置保留策略:
   使用 Minio 客户端为对象设置保留策略。例如,设置对象的保留期限为三年:
   mc retention set myminio/mybucket Governance 3y
   #这表示 `mybucket` 中的所有对象在接下来的三年内不能被删除或覆盖。

适用场景

1. 合规性存储:在金融、医疗等需要遵循严格数据保留法规的行业中,确保数据在规定时间内不被删除。
2. 数据保护:防止关键数据在指定时间内被意外或恶意删除。
3. 长期存储:对需要长期保存的重要数据进行保护。

上传图片时出现的问题

proxy_set_header Host

在 Nginx 配置中,proxy_set_header Host $http_host; 是为了将客户端请求中的 Host 头部传递给后端服务器。如果你的后端服务器收到的是 IP 而不是域名,可能是因为客户端请求中传递的 Host 头部是 IP。
  • 大多上传失败都是因为这个的问题。下面提供一个脚本,可以看下header的Host是否和接口域名/IP一致。如果HOST不一致,那么在nginx配置文件中将 proxy_set_header Host 改为对应的域名/IP就可以解决。
from http.server import HTTPServer, BaseHTTPRequestHandler

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'Hello, world!')

    def do_PUT(self):
        content_length = int(self.headers['Content-Length'])
        body = self.rfile.read(content_length)
        self.send_response(200)
        self.end_headers()
        response = bytes(body)
        self.wfile.write(response)
        print(self.headers)

httpd = HTTPServer(('0.0.0.0', 9000), SimpleHTTPRequestHandler)
httpd.serve_forever()

一般这种情况都是发生在内外网环境中,比如说我有一个项目,后台管理端是内网,但是访问页面都是在互联网中,我在内网上传图片时就会出现这种问题。除了更改herder Host之外,也可以在 /etc/hosts 中添加内网解析,同样可以解决。

  • 22
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勾魂皮卡丘

咋滴,打算白嫖啊?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值