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

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 进程 ID

events {
    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: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(数据写入)
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 就像一个“智能中转站”——接收客户端请求,按规则分给后端节点,还能适配不同协议,让后端服务更安全、更稳定、压力更均匀。

 

完整示例见下:

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;
        }
    }
}
<think>我们有一个需求:在Nginx代理MinIO的环境下,配置Nginx以拦截(即阻止访问)MinIO的crossdomain.xml文件。 根据用户提供的引用和需求,我们可以通过Nginx配置来实现对特定请求的拦截。 分析: 1. 用户希望拦截对crossdomain.xml的访问。 2. 通常,crossdomain.xml文件用于Flash等跨域策略,但有时可能出于安考虑需要屏蔽。 3. 我们可以通过Nginx的location块来匹配请求URI为crossdomain.xml的请求,并返回403(禁止访问)或404(未找到)。 配置思路: 在Nginx配置中,我们可以添加一个location块,专门匹配crossdomain.xml请求,然后返回错误状态码。 参考用户提供的引用[1]中关于跨域配置的例子,以及引用[3]中提到的crossdomain.xml文件内容,但我们的目标不是允许跨域,而是阻止访问该文件。 具体配置步骤: 假设我们的MinIO服务通过Nginx代理,用户访问MinIO的请求都是通过Nginx转发的。那么,在Nginx的server配置块中,我们可以这样写: ``` server { listen 80; server_name yourdomain.com; # 替换为你的域名 # 拦截crossdomain.xml请求 location = /crossdomain.xml { deny all; # 拒绝所有访问 return 403; # 或者 return 404; 根据需求选择 } # 代理MinIO的其他请求 location / { proxy_pass http://minio_server; # 替换为你的MinIO服务器地址 # 这里可以添加其他代理设置,如设置头信息等 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; # 如果需要,可以在这里添加跨域配置(如果MinIO需要跨域访问,但排除crossdomain.xml) # 但注意:我们已经在上面拦截了crossdomain.xml,所以不会影响跨域策略文件本身。 } } ``` 解释: 1. `location = /crossdomain.xml` 表示精确匹配/crossdomain.xml请求(注意:MinIO默认的crossdomain.xml路径就是在根目录下)。 2. `deny all;` 拒绝所有访问,然后返回403。也可以直接使用`return 403;`或`return 404;`。 3. 其他请求通过`location /`转发到MinIO服务器。 注意:MinIO可能有多个路径,但通常crossdomain.xml位于根路径。如果MinIO部署在子路径下,比如`http://yourdomain.com/minio/`,那么crossdomain.xml的请求路径可能是`/minio/crossdomain.xml`。因此,需要根据实际部署情况调整location的匹配路径。 如果MinIO部署在子路径下,例如代理路径为`/minio/`,那么配置应该调整为: ``` location = /minio/crossdomain.xml { deny all; return 403; } ``` 或者,如果希望无论MinIO部署在什么路径下都拦截,可以使用正则表达式匹配,但要注意正则表达式location的优先级。例如: ``` location ~* /crossdomain\.xml$ { deny all; return 403; } ``` 但是要注意,正则匹配可能会匹配到其他路径下的crossdomain.xml,如果确定只有MinIO的根路径下有这个文件,且不希望影响其他应用,建议使用精确匹配并指定完整路径。 另外,用户提供的引用[2]中有一个虚拟主机配置的示例,我们可以参考其基本结构。 最后,配置完成后需要重载Nginx使配置生效:`nginx -s reload` 相关问题: 1. 如何验证Nginx配置是否正确拦截了crossdomain.xml请求? 2. 除了返回403,还可以如何处理这种拦截请求? 3. 在Nginx中,location匹配的优先级规则是什么? 4. 如果MinIO部署在子路径下,如何确保拦截的是MinIO的crossdomain.xml而不是其他应用的?</think>### 在 Nginx 代理 MinIO 时拦截 crossdomain.xml 的配置方法 要拦截 MinIO 的 `crossdomain.xml` 文件请求,可通过 Nginx 的 `location` 规则精确匹配该文件并返回错误状态码。以下是完整配置方案: #### 配置示例 ```nginx server { listen 80; server_name minio.yourdomain.com; # 替换为实际域名 # 拦截 crossdomain.xml 请求 location = /crossdomain.xml { deny all; # 拒绝所有访问 return 403; # 返回 403 禁止状态 # 或 return 404; # 也可返回 404 隐藏文件存在 } # 代理 MinIO 其他请求 location / { proxy_pass http://minio-server:9000; # MinIO 实际地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 可选:保留跨域配置(不影响拦截) add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE'; } } ``` #### 关键配置说明 1. **精确拦截** `location = /crossdomain.xml` 使用 `=` 实现精确匹配,确保只拦截目标文件[^1]。 2. **拦截策略** - `deny all` + `return 403`:明确拒绝访问(推荐) - `return 404`:伪装文件不存在(更隐蔽) 3. **代理配置** `proxy_pass` 需指向 MinIO 服务器的真实地址(默认端口 9000),其他请求正常代理[^2]。 4. **生效验证** ```bash nginx -t # 检查配置语法 nginx -s reload # 重载配置 ``` 测试访问:`curl -I http://minio.yourdomain.com/crossdomain.xml` 应返回 403/404。 #### 注意事项 - 若 MinIO 部署在子路径(如 `/minio`),需修改为: `location = /minio/crossdomain.xml` - Adobe Flash 已淘汰,此配置主要防止不必要的安探测[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值