【Nginx】Nginx 多协议负载均衡实战:StarRocks 与 MinIO 代理配置全解析

文章目录

    • [一、Nginx 3大核心知识点(先搞懂本质)](#一、Nginx 3大核心知识点(先搞懂本质))
      • [1. 核心功能:反向代理(请求"中转站")](#1. 核心功能:反向代理(请求“中转站”))
      • [2. 核心功能:负载均衡(请求"分流器")](#2. 核心功能:负载均衡(请求“分流器”))
      • [3. 核心特性:按协议分层处理(不同请求不同玩法)](#3. 核心特性:按协议分层处理(不同请求不同玩法))
    • 二、结合实战配置:串联核心知识点
      • [(一)基础配置:给 Nginx 搭好运行环境](#(一)基础配置:给 Nginx 搭好运行环境)
      • [(二)四层代理(Stream 模块):处理 StarRocks JDBC 连接](#(二)四层代理(Stream 模块):处理 StarRocks JDBC 连接)
      • [(三)七层代理(HTTP 模块):处理 MinIO 和 StarRocks StreamLoad](#(三)七层代理(HTTP 模块):处理 MinIO 和 StarRocks StreamLoad)
        • [1. HTTP 基础配置:统一规则](#1. HTTP 基础配置:统一规则)
        • [2. 代理 MinIO 服务(分 API 和控制台)](#2. 代理 MinIO 服务(分 API 和控制台))
        • [3. 代理 StarRocks StreamLoad(数据写入)](#3. 代理 StarRocks StreamLoad(数据写入))
    • [三、总结:Nginx 配置的核心逻辑](#三、总结: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 搭好运行环境

nginx 复制代码
worker_processes  auto;  # 自动用所有 CPU 核心,提升并发能力
error_log  /var/log/nginx/error.log warn;  # 记录错误,方便排查
pid        /var/run/nginx.pid;  # 记录 Nginx 进程 ID

events {
    worker_connections  4096;  # 每个进程最多处理 4096 个连接
}
  • 逻辑:这部分是 Nginx 的"基础设置",就像给中转站搭好场地、配好工作人员,为后续代理做准备。

(二)四层代理(Stream 模块):处理 StarRocks JDBC 连接

nginx 复制代码
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 基础配置:统一规则
nginx 复制代码
http {
    include       /etc/nginx/mime.types;  # 识别文件类型(比如 .json、图片)
    sendfile        on;  # 高效传输大文件(比如 MinIO 上传的文件)
    keepalive_timeout  60s;  # 长连接超时时间,减少重复握手
    client_max_body_size 10240m;  # 允许最大上传 10GB 文件(适配大文件写入)
}
  • 逻辑:这是所有 HTTP 代理的"通用规则",比如允许传大文件、高效传输,不用每个服务重复配置。
2. 代理 MinIO 服务(分 API 和控制台)
nginx 复制代码
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:9000
        location / {  # 所有路径的请求都匹配
            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:9001
        location / {
            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(数据写入)
nginx 复制代码
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:8031
        location / {
            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 就像一个"智能中转站"------接收客户端请求,按规则分给后端节点,还能适配不同协议,让后端服务更安全、更稳定、压力更均匀。

完整示例见下:

conf 复制代码
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 通过此端口连接 StarRocks
        listen 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 headers
        ignore_invalid_headers off;
        # Allow any size file to be uploaded.
        # Set to a value such as 1000m; to restrict file size to a specific value
        client_max_body_size 0;
        # To disable buffering
        proxy_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.1
            proxy_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 headers
        ignore_invalid_headers off;
        # Allow any size file to be uploaded.
        # Set to a value such as 1000m; to restrict file size to a specific value
        client_max_body_size 0;
        # To disable buffering
        proxy_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 hashed
            real_ip_header X-Real-IP;

            proxy_connect_timeout 300;

            # To support websocket
            proxy_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 通过此端口进行 StreamLoad
        listen 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;
        }
    }
}
相关推荐
lwhdjbcjdjd2 小时前
Nginx实战指南:反向代理与负载均衡的原理与配置
运维·nginx·负载均衡
wa的一声哭了2 小时前
Linux服务器配置ssh免密登陆多台服务器、服务器别名配置
linux·运维·服务器·网络·arm开发·python·ssh
qinyia2 小时前
Wisdom SSH:AI助手可用的运维工具详解,帮助理解提升人机合作效率
运维·服务器·人工智能·ssh
YongCheng_Liang3 小时前
openEuler 22.03 LTS 部署 ELK(Elasticsearch+Logstash+Kibana)完整教程
linux·运维·elk·elasticsearch
小坏讲微服务3 小时前
Spring Cloud Alibaba 2025.0.0 整合 ELK 实现日志
运维·后端·elk·spring cloud·jenkins
清浅儿3 小时前
Linux权限知识点
linux·运维·服务器
kyle~3 小时前
Linux---文件控制<fcntl.h> (file control, fcntl)
linux·运维·服务器
头发还没掉光光3 小时前
Linux多线程之自旋锁与读写锁
linux·运维·算法
百***48933 小时前
Nginx实现接口复制
运维·nginx·junit