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 中添加内网解析,同样可以解决。