【Nginx】Nginx 多协议负载均衡实战:StarRocks 与 MinIO 代理配置全解析
文章目录
- 一、Nginx 3大核心知识点(先搞懂本质)
- 1. 核心功能:反向代理(请求“中转站”)
- 2. 核心功能:负载均衡(请求“分流器”)
- 3. 核心特性:按协议分层处理(不同请求不同玩法)
- 二、结合实战配置:串联核心知识点
- (一)基础配置:给 Nginx 搭好运行环境
- (二)四层代理(Stream 模块):处理 StarRocks JDBC 连接
- (三)七层代理(HTTP 模块):处理 MinIO 和 StarRocks StreamLoad
- 1. HTTP 基础配置:统一规则
- 2. 代理 MinIO 服务(分 API 和控制台)
- 3. 代理 StarRocks StreamLoad(数据写入)
- 三、总结:Nginx 配置的核心逻辑
Nginx 最核心的价值是 “反向代理”和“负载均衡”,再加上“按协议分层处理”的特性,就能搞定大部分分布式场景。本文先讲最关键的3个核心知识点,再结合实战配置串起来,让你一看就懂、一用就会。
一、Nginx 3大核心知识点(先搞懂本质)
1. 核心功能:反向代理(请求“中转站”)
- 通俗理解:客户端不直接连后端服务(比如 StarRocks、MinIO),而是先连 Nginx,Nginx 再把请求转交给后端,最后把结果返回给客户端。
- 核心作用:隐藏后端服务器地址(安全)、统一入口(客户端不用记多个端口)、适配不同协议(TCP/HTTP)。
2. 核心功能:负载均衡(请求“分流器”)
- 通俗理解:后端有多个服务节点(比如 2 台 MinIO、3 台 StarRocks FE),Nginx 按规则把请求分到不同节点,避免某一台压力过大。
- 核心策略:
- 轮询(默认):请求依次分给每个节点,适合节点性能差不多的情况;
- IP 哈希:同一客户端的请求始终分给同一节点,适合需要保持登录状态的场景(比如 MinIO 控制台)。
3. 核心特性:按协议分层处理(不同请求不同玩法)
- 四层代理(Stream 模块):只处理 TCP 协议(比如数据库连接),不解析请求内容,只管“转发数据流”,速度快;
- 七层代理(HTTP 模块):处理 HTTP 协议(比如 Web 服务、文件上传),能解析请求头、路径,支持更灵活的规则(比如改请求头、按路径转发)。
二、结合实战配置:串联核心知识点
下面对照配置,看 Nginx 是怎么用这3个核心知识点干活的,重点看“配置对应什么功能”,不用纠结复杂参数。
(一)基础配置:给 Nginx 搭好运行环境
worker_processes auto; # 自动用所有 CPU 核心,提升并发能力
error_log /var/log/nginx/error.log warn; # 记录错误,方便排查
pid /var/run/nginx.pid; # 记录 Nginx 进程 IDevents {worker_connections 4096; # 每个进程最多处理 4096 个连接
}
- 逻辑:这部分是 Nginx 的“基础设置”,就像给中转站搭好场地、配好工作人员,为后续代理做准备。
(二)四层代理(Stream 模块):处理 StarRocks JDBC 连接
stream {# 1. 定义后端集群(负载均衡的“节点池”)upstream starrocks_jdbc {server 192.168.1.10:9030 weight=1 max_fails=3 fail_timeout=60s;server 192.168.1.11:9030 weight=1 max_fails=3 fail_timeout=60s;}# 2. 定义转发规则(反向代理的“入口”)server {listen 9031; # 客户端连接 Nginx 的 9031 端口proxy_pass starrocks_jdbc; # 把请求转发到上面的集群proxy_connect_timeout 30s; # 30 秒连不上后端就算失败}
}
- 核心知识点对应:
- 反向代理:客户端连 Nginx:9031,Nginx 转交给 StarRocks FE:9030,客户端看不到后端 IP;
- 负载均衡:用“轮询”策略,请求依次分给 192.168.1.10 和 192.168.1.11;
- 四层代理:Stream 模块只转发 TCP 数据流,不关心 JDBC 协议的内容,速度快。
- 简单流程:客户端(Flink)→ Nginx:9031 → 轮询到 StarRocks FE 节点 → 返回结果。
(三)七层代理(HTTP 模块):处理 MinIO 和 StarRocks StreamLoad
HTTP 模块是最常用的场景,核心是“解析 HTTP 请求,按规则转发”,下面分两部分看:
1. HTTP 基础配置:统一规则
http {include /etc/nginx/mime.types; # 识别文件类型(比如 .json、图片)sendfile on; # 高效传输大文件(比如 MinIO 上传的文件)keepalive_timeout 60s; # 长连接超时时间,减少重复握手client_max_body_size 10240m; # 允许最大上传 10GB 文件(适配大文件写入)
}
- 逻辑:这是所有 HTTP 代理的“通用规则”,比如允许传大文件、高效传输,不用每个服务重复配置。
2. 代理 MinIO 服务(分 API 和控制台)
http {# (1)定义 MinIO 集群(负载均衡)upstream minio { # MinIO 数据 API 集群(无状态,用轮询)server minio1:9000 weight=1 max_fails=3 fail_timeout=600s;server minio2:9000 weight=1 max_fails=3 fail_timeout=600s;}upstream console { # MinIO 控制台集群(有状态,用 IP 哈希)ip_hash; # 同一客户端始终连同一节点,保持登录状态server minio1:9001 weight=1 max_fails=3 fail_timeout=600s;server minio2:9001 weight=1 max_fails=3 fail_timeout=600s;}# (2)代理 MinIO API(9000 端口,反向代理)server {listen 9000; # 客户端访问 Nginx:9000location / { # 所有路径的请求都匹配proxy_pass http://minio; # 转发到 minio 集群# 转发客户端真实 IP 和域名,让 MinIO 知道请求来源proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;}}# (3)代理 MinIO 控制台(9001 端口,反向代理)server {listen 9001; # 客户端访问 Nginx:9001location / {proxy_pass http://console; # 转发到 console 集群proxy_set_header Host $http_host;}}
}
- 核心知识点对应:
- 反向代理:客户端访问 Nginx:9000(API)或 9001(控制台),Nginx 转交给 MinIO 节点;
- 负载均衡:API 用轮询(无状态,随便分),控制台用 IP 哈希(有状态,保会话);
- 七层代理:解析 HTTP 请求头,转发时带上客户端真实 IP,适配 MinIO 的协议要求。
3. 代理 StarRocks StreamLoad(数据写入)
http {# (1)定义 StreamLoad 集群(负载均衡)upstream starrocks_streamload {server 192.168.1.10:8030 weight=1 max_fails=3 fail_timeout=60s;}# (2)代理转发规则(反向代理)server {listen 8031; # 客户端(Flink)连接 Nginx:8031location / {proxy_pass http://starrocks_streamload; # 转发到集群proxy_set_header Expect "100-continue"; # 适配 StreamLoad 协议要求proxy_next_upstream error timeout; # 后端节点故障,自动切到下一个}}
}
- 核心知识点对应:
- 反向代理:Flink 不直接连 StarRocks:8030,而是通过 Nginx:8031 转发;
- 负载均衡:轮询分发写入请求,避免单个节点压力过大;
- 七层代理:解析 HTTP 请求,添加 StreamLoad 必需的请求头,还能实现故障自动切换(节点挂了换另一个)。
三、总结:Nginx 配置的核心逻辑
不管是 TCP 代理还是 HTTP 代理,配置逻辑永远是 “先定义后端集群(upstream)→ 再定义前端入口(server)→ 最后绑定转发规则(proxy_pass)”,而支撑这一切的核心就是“反向代理”“负载均衡”“按协议分层处理”这3个知识点。
简单记:Nginx 就像一个“智能中转站”——接收客户端请求,按规则分给后端节点,还能适配不同协议,让后端服务更安全、更稳定、压力更均匀。
完整示例见下:
user nginx;
worker_processes auto;error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;events {worker_connections 4096;
}# ============================================================================
# StarRocks JDBC 负载均衡配置(TCP Stream)
# ============================================================================
# 用于负载均衡 Flink 中对 StarRocks 的 JDBC 请求
# 通过 stream 模块实现 TCP 协议的反向代理
# ============================================================================
stream {upstream starrocks_jdbc {# 轮询方式(默认),因为 StarRocks FE 的 Leader 和 Follower 都可以处理请求# max_fails=3: 连续失败3次后标记为不可用# fail_timeout=60s: 60秒后重新尝试该节点# 注意:使用 IP 地址而非容器名(host 网络模式)# 此配置由 init-env.sh 脚本根据 app.env 中的 FE_NODES 自动生成# 示例配置(会被脚本自动替换):# server 192.168.1.10:9030 weight=1 max_fails=3 fail_timeout=60s; # Leader# server 192.168.1.11:9030 weight=1 max_fails=3 fail_timeout=60s; # Follower# server 192.168.1.12:9030 weight=1 max_fails=3 fail_timeout=60s; # Follower}server {# Nginx 监听端口,Flink 通过此端口连接 StarRockslisten 9031;proxy_pass starrocks_jdbc;proxy_timeout 60s;proxy_connect_timeout 30s;}
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;# 用于管理 HTTP 长连接生命周期的参数# 定义了一个 TCP 连接在完成最后一次数据传输后,仍然保持打开状态等待新的请求的最大时间keepalive_timeout 60;# 允许上传大文件(用于 StreamLoad)client_max_body_size 10240m;# include /etc/nginx/conf.d/*.conf;upstream minio {server minio1:9000 weight=1 max_fails=3 fail_timeout=600s;server minio2:9000 weight=1 max_fails=3 fail_timeout=600s;
# server minio3:9000;
# server minio4:9000;}upstream console {ip_hash;server minio1:9001 weight=1 max_fails=3 fail_timeout=600s;server minio2:9001 weight=1 max_fails=3 fail_timeout=600s;
# server minio3:9001;
# server minio4:9001;}server {listen 9000;# listen [::]:9000;server_name localhost;# To allow special characters in headersignore_invalid_headers off;# Allow any size file to be uploaded.# Set to a value such as 1000m; to restrict file size to a specific valueclient_max_body_size 0;# To disable bufferingproxy_buffering off;proxy_request_buffering off;location / {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_connect_timeout 300;# Default is HTTP/1, keepalive is only enabled in HTTP/1.1proxy_http_version 1.1;proxy_set_header Connection "";chunked_transfer_encoding off;proxy_pass http://minio;}}server {listen 9001;
# listen [::]:9001;server_name localhost;# To allow special characters in headersignore_invalid_headers off;# Allow any size file to be uploaded.# Set to a value such as 1000m; to restrict file size to a specific valueclient_max_body_size 0;# To disable bufferingproxy_buffering off;proxy_request_buffering off;location / {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;# This is necessary to pass the correct IP to be hashedreal_ip_header X-Real-IP;proxy_connect_timeout 300;# To support websocketproxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";chunked_transfer_encoding off;proxy_pass http://console;}}# ============================================================================# StarRocks StreamLoad 负载均衡配置(HTTP)# ============================================================================# 用于负载均衡 Flink 中通过 StarRocks 的 StreamLoad 方式写入数据# 通过 http 模块实现 HTTP 协议的反向代理# ============================================================================upstream starrocks_streamload {# 轮询方式(默认)# max_fails=3: 连续失败3次后标记为不可用# fail_timeout=60s: 60秒后重新尝试该节点# 注意:使用 IP 地址而非容器名(host 网络模式)# 此配置由 init-env.sh 脚本根据 app.env 中的 FE_NODES 自动生成# 示例配置(会被脚本自动替换):# server 192.168.1.10:8030 weight=1 max_fails=3 fail_timeout=60s; # Leader# server 192.168.1.11:8030 weight=1 max_fails=3 fail_timeout=60s; # Follower# server 192.168.1.12:8030 weight=1 max_fails=3 fail_timeout=60s; # Follower}server {# Nginx 监听端口,Flink 通过此端口进行 StreamLoadlisten 8031;server_name localhost;location / {proxy_pass http://starrocks_streamload;# 添加 Expect: 100-continue 请求头# 解决 Flink StreamLoad 时 "There is no 100-continue header" 错误proxy_set_header Expect "100-continue";# 故障转移策略:当出现以下错误时,nginx 会尝试与下一台服务器连接proxy_next_upstream error timeout http_500 http_502 http_503 http_504;# 连接超时设置proxy_connect_timeout 30s;proxy_send_timeout 60s;proxy_read_timeout 60s;# 禁用缓冲,确保数据实时传输proxy_buffering off;proxy_request_buffering off;}}
}
