简介:本文深入解析Nginx四层负载均衡的核心机制,涵盖TCP/UDP协议支持、调度算法选择、健康检查策略及高可用架构设计,提供从基础配置到生产环境优化的全流程指导。
四层负载均衡工作在OSI模型的传输层(TCP/UDP),与七层(应用层HTTP)形成互补。其核心价值体现在:
典型应用场景包括:数据库集群路由、游戏服务器分发、物联网设备通信等需要底层协议处理的场景。相较于HAProxy等传统四层解决方案,Nginx Plus版本通过stream模块提供了更灵活的配置方式。
Nginx通过stream模块实现四层负载均衡,采用异步非阻塞I/O模型:
Nginx四层支持以下核心调度策略:
upstream tcp_backend {server 192.168.1.1:3306;server 192.168.1.2:3306;}
upstream tcp_backend {least_conn;server 192.168.1.1:3306;server 192.168.1.2:3306;}
upstream tcp_backend {ip_hash;server 192.168.1.1:3306;server 192.168.1.2:3306;}
Nginx提供两种健康检查方式:
upstream tcp_backend {zone tcp_backend 64k;server 192.168.1.1:3306 max_fails=3 fail_timeout=30s;server 192.168.1.2:3306 max_fails=3 fail_timeout=30s;}server {listen 3306;proxy_pass tcp_backend;health_check interval=10s fails=3 passes=2;}
# 主配置文件nginx.conf中加载stream模块load_module modules/ngx_stream_module.so; # 开源版需编译时包含--with-streamstream {upstream mysql_cluster {least_conn;server 10.0.0.1:3306 max_fails=2 fail_timeout=30s;server 10.0.0.2:3306 max_fails=2 fail_timeout=30s;server 10.0.0.3:3306 backup; # 备用节点}server {listen 3306;proxy_pass mysql_cluster;proxy_timeout 3s;proxy_connect_timeout 1s;}}
| 参数 | 推荐值 | 作用说明 |
|---|---|---|
| worker_processes | auto | 与CPU核心数一致 |
| worker_connections | 65535 | 单个worker最大连接数 |
| so_keepalive | on | 启用TCP keepalive |
| tcp_nodelay | on | 禁用Nagle算法 |
| send_timeout | 2s | 发送超时时间 |
stream {log_format proxy '$remote_addr [$time_local] ''$protocol $status $bytes_sent $bytes_received ''$session_time "$upstream_addr"';access_log /var/log/nginx/tcp-access.log proxy;error_log /var/log/nginx/tcp-error.log warn;upstream backend {server 192.168.1.1:3306;server 192.168.1.2:3306;}}
+----------------+ +----------------+| Master Nginx |-----| Backup Nginx || 192.168.1.10 | | 192.168.1.11 |+----------------+ +----------------+│ │▼ ▼+----------------+ +----------------+| Real Server 1 | | Real Server 2 || 10.0.0.1:3306 | | 10.0.0.2:3306 |+----------------+ +----------------+
配置要点:
vrrp_script chk_nginx {script "killall -0 nginx"interval 2weight -20}vrrp_instance VI_1 {interface eth0state MASTERvirtual_router_id 51priority 100virtual_ipaddress {192.168.1.100}track_script {chk_nginx}}
典型三层架构:
连接超时:
proxy_connect_timeout设置
tcpdump -i eth0 port 3306 -nn -v
连接泄漏:
active connections指标proxy_timeout不均衡负载:
least_time算法(Nginx Plus)| 指标 | 监控工具 | 正常范围 |
|---|---|---|
| 并发连接数 | netstat/ss | < worker_connections*worker_processes |
| 连接建立速率 | nginx_upstream_accepts_total | 根据业务预期 |
| 响应时间 | nginx_upstream_header_time | < 500ms(视业务而定) |
| 错误率 | nginx_upstream_responses_5xx | < 0.1% |
SSL终止(Nginx解密):
stream {server {listen 443 ssl;proxy_pass backend;ssl_certificate /etc/nginx/ssl/server.crt;ssl_certificate_key /etc/nginx/ssl/server.key;ssl_protocols TLSv1.2 TLSv1.3;}}
SSL透传(后端解密):
stream {server {listen 443;proxy_pass backend;proxy_ssl on;proxy_ssl_certificate /etc/nginx/ssl/client.crt;proxy_ssl_certificate_key /etc/nginx/ssl/client.key;}}
stream {server {listen 12345;proxy_pass backend;proxy_download_rate 1m; # 下载限速1MB/sproxy_upload_rate 512k; # 上传限速512KB/s}}
通过Lua脚本实现动态权重调整(需Nginx Plus或OpenResty):
local upstream = require "ngx.upstream"local get_servers = upstream.get_serverslocal set_server = upstream.set_serverlocal servers = get_servers("tcp_backend")for i, server in ipairs(servers) doif server.name == "10.0.0.1:3306" thenset_server("tcp_backend", i, {weight = 100}) -- 动态调整权重endend
通过系统化的四层负载均衡设计,企业可构建高可用、高性能的基础架构层,为上层业务提供稳定的网络通信保障。实际部署时需结合具体业务场景进行参数调优,并建立完善的监控告警体系。