文章目录
-
- [一、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;
}
}
}