目录
Nginx Proxy for MinIO Cluster
虽然MinIO集群内置了负载均衡和高可用,但是用Nginx代理MinIO集群还有其他的好处:
- 负载均衡与高可用(非主要)
- 统一入口与域名管理
- 性能优化
1. MinIO 集群配置
首先已经部署了一个MinIO集群(例如 4 个节点:node201
、node202
、node203
、node204
),并且每个节点都可以通过 HTTP 访问(例如 http://node201:9000
)。MinIO集群搭建参考:MinIO在Linux上的集群安装与部署-优快云博客
2. 安装配置 Nginx
2.1. 安装 Nginx
在一台新的虚拟机或现有虚拟机上安装 Nginx,这里使用192.168.33.205
yum install nginx -y
2.2. 配置 Nginx 作为负载均衡器
编辑 Nginx 配置文件 vim /etc/nginx/nginx.conf
,添加以下内容:
http {
upstream minio_api {
# 配置 MinIO 集群节点
server node201:9000;
server node202:9000;
server node203:9000;
server node204:9000;
}
upstream minio_console {
# 配置 MinIO 集群节点
server node201:9001;
server node202:9001;
server node203:9001;
server node204:9001;
}
server {
listen 9000;
server_name 192.168.33.205; # 替换为你的域名或 IP
location / {
proxy_pass http://minio_api;
proxy_set_header Host $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;
}
}
server {
listen 9001;
server_name 192.168.33.205; # 替换为你的域名或 IP
location / {
proxy_pass http://minio_console;
proxy_set_header Host $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;
}
}
}
upstream minio_cluster
:定义 MinIO 集群节点。proxy_pass
:将请求转发到 MinIO 集群。
2.3. 解决SELinux限制
2.3.1. SELinux解析
SELinux(Security-Enhanced Linux)是 Linux 内核的强制访问控制(MAC)安全模块,核心作用包括:
- 最小权限原则
每个进程(如Nginx、Minio)仅拥有完成其任务所需的最小权限,即使进程以root身份运行,仍受策略限制。
示例:Nginx默认无法绑定非HTTP端口,也无法访问Minio集群地址。 - 防止提权攻击
即使攻击者利用漏洞获取进程控制权,也无法突破SELinux策略访问其他资源。 - 细粒度资源控制
通过定义策略,精确控制:
-
- 进程能访问的文件、目录、端口。
- 进程之间的通信权限(如Nginx与Minio的API交互)。
- 安全上下文(Context)
所有系统资源(文件、端口、进程)被赋予安全标签(如http_port_t
),策略基于标签匹配权限。
模式 | 作用 | 适用场景 |
Enforcing | 强制执行安全策略,阻止所有违反策略的操作,并记录日志。 | 生产环境,需严格安全控制时。 |
Permissive | 仅记录违反策略的操作,不实际阻止。用于审计和调试策略问题。 | 调试阶段,需要观察哪些操作会被SELinux拦截,但不想中断服务时。 |
Disabled | 完全关闭SELinux,不加载任何策略。需重启生效,且重新启用后需重新标记文件系统上下文。 | 临时解决兼容性问题,或确认问题与SELinux无关时(不推荐长期使用)。 |
sudo setenforce 1 # 切换为Enforcing(临时生效,重启后失效)
sudo setenforce 0 # 切换为Permissive
sudo vi /etc/selinux/config # 永久修改模式(需重启)
2.3.2. SELinux限制解除
- SELinux 限制访问外部网络
SELinux会限制 httpd_t
(Nginx 进程域)的网络访问权限,拦截对外部服务的 TCP 连接,需要手动开启
# 永久允许Nginx网络连接
setsebool -P httpd_can_network_connect 1
# 验证设置
getsebool httpd_can_network_connect
- SELinux 的端口类型限制
SELinux 为不同服务定义了可绑定的端口类型:80, 443, 8080, 8443
等,非标准端口默认不属于 http_port_t
,因此 Nginx 会被 SELinux 阻止绑定,需要手动添加
yum install policycoreutils-python -y
#检查端口是否被 SELinux 允许
semanage port -l | grep http_port_t
# 添加端口 9000 9001 到 http_port_t 类型
semanage port -a -t http_port_t -p tcp 9000
semanage port -a -t http_port_t -p tcp 9001
2.4. 启动 Nginx
systemctl start nginx
systemctl enable nginx
2.5. 验证 Nginx 配置
访问 Nginx 服务器的 IP 或域名(例如 http://192.168.33.205:9000
),确认请求被正确转发到 MinIO 集群。
2.6. 查看 Nginx 日志
tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/access.log