TCP/UDP 负载均衡
约 485 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › Nginx › 负载均衡(在新窗口打开) › TCP/UDP 负载均衡
Nginx 从 1.9.0 开始支持 TCP 和 UDP 的负载均衡(通过 stream 模块),适用于数据库、Redis、DNS 等非 HTTP 协议服务。
启用 stream 模块
# 编译时需包含 --with-stream
nginx -V 2>&1 | grep with-stream
# 有输出表示已包含
# Ubuntu/Debian 默认已包含
# macOS Homebrew 默认已包含MySQL 负载均衡
# /etc/nginx/nginx.conf
stream {
upstream mysql_backend {
server 10.0.0.1:3306;
server 10.0.0.2:3306;
}
server {
listen 3306;
proxy_pass mysql_backend;
proxy_connect_timeout 5s;
proxy_timeout 30s;
}
}PostgreSQL 负载均衡
stream {
upstream pgsql_backend {
least_conn;
server 10.0.0.1:5432;
server 10.0.0.2:5432;
}
server {
listen 5432;
proxy_pass pgsql_backend;
proxy_timeout 60s;
}
}Redis 负载均衡
stream {
upstream redis_backend {
server 10.0.0.1:6379;
server 10.0.0.2:6379;
server 10.0.0.3:6379;
}
server {
listen 6379;
proxy_pass redis_backend;
proxy_connect_timeout 1s;
}
}UDP 负载均衡(DNS 场景)
stream {
upstream dns_servers {
server 8.8.8.8:53;
server 8.8.4.4:53;
}
server {
listen 53 udp;
proxy_pass dns_servers;
proxy_responses 1; # 期望的响应数
proxy_timeout 5s;
}
}| 指令 | 说明 |
|---|---|
listen 53 udp | 监听 UDP 端口 |
proxy_responses 1 | 每个请求期望的响应包数量 |
proxy_timeout | 等待响应的超时时间 |
stream 配置选项
stream {
# 日志
log_format stream_log '$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $session_time';
access_log /var/log/nginx/stream.log stream_log;
error_log /var/log/nginx/stream.log debug;
# 负载均衡配置
upstream backend {
least_conn;
server 10.0.0.1:3306 max_fails=2 fail_timeout=10s;
server 10.0.0.2:3306 max_fails=2 fail_timeout=10s;
server 10.0.0.3:3306 backup;
}
server {
listen 3306;
proxy_pass backend;
proxy_connect_timeout 5s;
proxy_timeout 30s;
}
}SSL/TLS 穿透
stream {
upstream mysql_ssl {
server 10.0.0.1:3306;
}
server {
listen 3307 ssl;
proxy_pass mysql_ssl;
ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.key;
ssl_protocols TLSv1.2 TLSv1.3;
}
}stream 与 http 的配置结构
# nginx.conf
events {
worker_connections 1024;
}
http {
# HTTP 配置...
}
stream {
# TCP/UDP 配置...
}stream 与 http 是平级的上下文,互不干扰,可以同时使用。
小结
stream模块支持非 HTTP 协议的负载均衡,需编译时包含--with-stream。- 支持 TCP(MySQL、PostgreSQL、Redis)和 UDP(DNS、NTP)。
- 配置结构与 HTTP 类似:
upstream定义后端,server监听端口。 - UDP 监听加
udp关键字:listen 53 udp。 stream与http是平级的上下文,可同时存在于 nginx.conf。
