问题
客户端访问minio控制台成功,内部应用写文件到minio服务403失败。
出现403问题可推测的要点如下:
用户名/密码错误;
密钥证书问题;
IP/PORT被限制;
目录/文件写入权限过低;
流程图
注:
客户端要访问C1的服务,那么必须经过A->B1->B2->C1的过程。
C1要访问外部客户端的第三方服务,那么必须经过C1->B2->B1->A的过程。
(必须记住上述流程,不然下述的解决方案就看不懂了!此次问题只需关注B1、B2、C1。)
其中B1和B2都做了NAT映射,都具备实际1个实际内网IP和NAT-IP。
其中B1跳B2和B2跳C1,都需要安装nginx代理各自的NAT-IP,反过来同理。
其中,只有B1和B2有NAT-IP,C1只有1个实际内网IP。
此次,minio部署在B1(控制台与服务),而访问的java应用为C1,C1为前后端未分离的WEB工程,C1需要通过B2访问B1的minio服务,即从下层向上层访问,所以才出现的403问题。
当然,客户端直接访问ninio控制台是没问题的,直接域名代理进来即可。
====访问minio控制台流程:
====内部应用访问minio服务流程:
解决方案
一是:项目中的yml文件配置的minio用户名和密码错误。
配置的为minio控制台登录的用户名和密码,应修改成在Minio控制台创建用户时的用户名和默认加密后的密码。
二是:minio写入文件的目录只有读权限,而没有写权限,手工改为可读写权限。
三是:C1部署的应用有WEB控制台,而C1需要上传图片到B1,那么就要经过B2和B1的nginx代理,那么需要注意的是,也是最重要的,在B1的nginx配置了allow允许的IP网段,为B2的NAT-IP,在B2的nginx中配置了allow允许的IP网段只有C1的IP网段,但是用户操作的机器C3所属IP和C1所属网段可能不是同一个,但是二者是互通的,导致B2的nginx直接拒绝掉了C1的访问,因为 nginx校验的并不是C1的IP,而是用户操作的机器C3的IP,这是nginx的特点 ,所以修改B2和B1的allow的IP网段即可。
排查思路
第一,也是最重要的,必须清楚架构流程,当了解具体的硬件架构流程后,需要把控每个结点的基本细节,比如IP(映射方式、网卡)、防火墙、用户、目录权限、网络环境(最为重要,出口、入口、网段、访问方式)。
第二,其次重要的,软件架构流程,比如配置文件中各个组件的配置、用户名密码、目录、第三方服务、各模块的依赖与访问方式。
第三,根据某个问题,逐一推敲,当获取到上述内容后,在表面问题排查后,如访问不通,此时, 不要相信任何人,作为一名技术人员,此时只相信自己!眼见为实!不要自以为是!技术只有对与错 !
第四,根据此次java应用访问minio时403问题,在解决了目录权限与用户名密码基础问题后,只有网络问题不清楚。
排查方案
最后的推测/解决访问,我认为是最稳妥也是最有效的,我单独建立只包含minio上传文件功能的main()的jar包,放在了B1、B2、C1的服务器上,minio的用户名与密码都正确,只有minio访问的IP不同,其中B1代理了minio服务的IP。
在长链路排查问题时,当基础配置问题解决完成后,如现在下层访问上层网络不通,那么先解决上层问题,再解决下层问题,人手足够,可上下兼顾。
====其中配置了下述几种情况:
====第一种情况:
此时,并不能确认NAT-IP是正确的。
这个时候,确保写入文件的用户和所属目录有读写权限,没有,则设置正确。
====第二种情况:
再次执行各个jar包,此时能确认C1只能通过B2的NAT-IP才能反问到B1的minio服务,并且能通过C1服务器上传图片到B1的minio服务中。
但是此时,当再次校验C1的java项目中配置的用户名密码和IP正确后,浏览器通过minio服务传图片依然403。
查询nginx的日志发现客户端IP,并且再次核实与各个nginx中allow配置的IP网段不符,修改各个nginx中allow配置的IP网段后,再次测试,并完成上传功能。
另外
当上传JPG到服务器时,会被自动放大,文件大小变为几十倍。
初衷,想把上传到C1服务器的图片改到B1,加快小程序访问图片的速度,但是没改,一是B1的服务器资源有限,二是,B1与C1的图片对不上,可能会有丢失图片以及运维minio的问题,大大加大了项目的复杂度,所以没使用minio。
Minio使用
官方文档:
https://min.io/docs/minio/linux/index.html
官网
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
vim /etc/systemd/system/minio.service. For binary installations, create this file manually on all MinIO hosts:
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
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/local/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@minio01 minios]# pwd
/usr/local/minios
[root@minio01 minios]#wget https://dl.min.io/server/minio/release/linux-amd64/minio
[root@minio01 minios]# ll
total 99284
drwxr-xr-x 6 root root 4096 Jul 31 2023 data
drwxr-xr-x 2 root root 4096 Jun 24 22:38 logs
-rwxr-xr-x 1 root root 101654528 Jun 20 06:40 minio
[root@minio01 system]# pwd
/etc/systemd/system
[root@minio01 system]# cat minio.service
[UNIT]
Description=Minio Service
[Service]
Environment="MINIO_ROOT_USER=admin"
Environment="MINIO_ROOT_PASSWORD=minio@135"
ExecStart=/usr/local/minios/minio server /usr/local/minios/data --address ":9002" --console-address ":9003"
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
StandardOutput=/usr/local/minios/logs/minio.log
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@minio01 system]# systemctl enable minio.service
[root@minio01 system]# systemctl start minio.service
[root@minio01 system]# systemctl status minio.service
控制台
启动minio后访问控制台,创建用户和所属用户组及权限、登录新建用户创建访问密钥和bucket后配置到java项目的yml文件中即可。
“http://10.0.0.201:9003/”
admin/minio@135
testuser01/testuser01