Nginx实现TCP/UDP负载均衡的详细配置示例,涵盖基础配置、高级功能及运维方案

以下是一个关于Nginx实现TCP/UDP负载均衡的详细配置示例,涵盖基础配置、高级功能及运维方案:

一、基础TCP负载均衡配置(以MySQL为例)

# 主配置文件 nginx.conf
worker_processes auto;

events {
  worker_connections 65535;
  use epoll;  # Linux高效事件模型
}

stream {
  # 定义TCP服务组(MySQL 3306端口)
  upstream mysql_servers {
    zone tcp_servers 64k;  # 共享内存区(用于状态监控)
    
    server 192.168.1.100:3306 weight=5;  # 主节点
    server 192.168.1.101:3306 weight=3;  # 备节点
    server 192.168.1.102:3306 backup;    # 应急节点

    # 健康检查配置
    health_check interval=10s            # 每10秒检查一次
               fails=3                   # 连续失败3次标记为不可用
               passes=2                  # 需连续成功2次恢复可用
               port=3306;                # 自定义健康检查端口
  }

  # TCP服务监听
  server {
    listen 3306;
    proxy_pass mysql_servers;
    proxy_timeout 60s;                  # 全局超时时间
    proxy_connect_timeout 5s;           # 连接建立超时

    # 会话保持(基于客户端IP)
    hash $remote_addr consistent;        # 一致性哈希算法
  }

  # 访问控制示例
  server {
    listen 6379;  # Redis服务
    proxy_pass redis_servers;

    allow 192.168.1.0/24;  # 允许内网访问
    deny all;              # 拒绝其他IP
  }
}

二、UDP负载均衡配置(以DNS为例)

stream {
  # 定义UDP服务组(DNS 53端口)
  upstream dns_servers {
    server 10.0.0.20:53 weight=5;
    server 10.0.0.21:53 weight=3;

    # UDP健康检查配置
    health_check udp=yes              # 声明为UDP检查
               type=dns               # 检查类型为DNS
               interval=5s            # 检查间隔
               fails=2                # 失败阈值
               passes=1;              # 恢复阈值
  }

  # UDP服务监听
  server {
    listen 53 udp;  # 关键参数:指定UDP协议
    proxy_pass dns_servers;
    proxy_timeout 30s;
    proxy_responses 1;  # 期望响应数(DNS查询通常为1)

    # 访问日志配置
    access_log /var/log/nginx/dns_access.log udp_log;
  }
}

三、高级功能配置

1. SSL/TLS终止(TCP+SSL场景)
stream {
  upstream secure_service {
    server 172.16.0.10:8443;
    server 172.16.0.11:8443;
  }

  server {
    listen 443 ssl;
    ssl_preread on;  # 启用SSL预读

    ssl_certificate /etc/nginx/ssl/server.pem;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    ssl_protocols TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256;

    proxy_pass secure_service;
    proxy_protocol on;  # 启用PROXY协议传递客户端信息
  }
}
2. 负载均衡算法优化
stream {
  # 最少连接算法(动态选择)
  upstream l4_loadbalancer {
    least_conn;  # 覆盖默认轮询算法
    server 10.0.0.30:8080;
    server 10.0.0.31:8080;
  }

  # 加权轮询(静态权重)
  upstream weighted_servers {
    server 10.0.0.40:8080 weight=3;
    server 10.0.0.41:8080 weight=1;
  }
}
3. 流量镜像(调试场景)
stream {
  upstream main_service {
    server 10.0.0.50:8080;
  }

  server {
    listen 8080;
    proxy_pass main_service;

    # 流量镜像配置
    mirror /dev/null;  # 丢弃镜像流量
    mirror_request_body on;  # 镜像请求体
  }
}

四、监控与维护配置

1. 实时状态监控
stream {
  server {
    listen 8080;
    proxy_pass tcp_status_server;

    location /stream_status {
      # 自定义TCP状态页(需Lua模块)
      content_by_lua_block {
        local connections = ngx.shared.tcp_connections
        ngx.say("Active connections: ", connections.active)
        ngx.say("Total connections: ", connections.total)
      }
      allow 192.168.1.0/24;
      deny all;
    }
  }
}
2. 详细日志记录
stream {
  log_format tcp_log '$remote_addr [$time_local] '
                    '$protocol $status $session_time '
                    '$bytes_sent $bytes_received';
  access_log /var/log/nginx/tcp_access.log tcp_log;
}

五、性能调优建议

  1. 内核参数优化

    # 调整TCP参数
    sysctl -w net.core.somaxconn=65535
    sysctl -w net.ipv4.tcp_max_syn_backlog=65535
    sysctl -w net.ipv4.tcp_fin_timeout=30
    sysctl -w net.ipv4.tcp_tw_reuse=1
    
  2. Nginx配置优化

    • 调整worker_connections匹配业务需求
    • 启用multi_accept on批量接受连接
    • 对高频服务配置reuseport参数(需Linux 3.9+)
  3. 连接管理

    • 使用so_keepalive=on启用TCP Keepalive
    • 配置proxy_timeout合理值防止连接泄漏

六、测试与验证

  1. TCP服务测试

    # 使用mysql客户端测试
    mysql -h nginx_ip -P 3306 -u user -p
    
    # 使用nc工具测试
    nc -vz nginx_ip 3306
    
  2. UDP服务测试

    # 使用dig命令测试DNS
    dig @nginx_ip example.com
    
    # 使用nc工具测试UDP
    echo "test" | nc -u nginx_ip 53
    
  3. 实时监控

    # 观察TCP连接状态
    ss -s | grep tcp
    
    # 分析访问日志
    awk '{print $4}' /var/log/nginx/tcp_access.log | sort | uniq -c
    

七、注意事项

  1. 模块依赖:确保Nginx编译时包含--with-stream参数
  2. 协议特性:UDP为无状态协议,需业务层实现会话保持
  3. 防火墙配置:开放TCP/UDP端口(注意云服务商安全组规则)
  4. 日志轮转:配置logrotate定期切割stream模块日志

该配置示例实现了四层负载均衡的核心功能,可根据实际需求扩展以下方向:

  • 集成Consul/Etcd实现服务发现
  • 配置动态DNS解析(通过resolver指令)
  • 实现全局负载均衡(结合GeoIP模块)
  • 添加DDoS防护(通过limit_conn/limit_rate指令)

建议通过专业测试工具(如tcpreplay、iperf)验证配置效果,并结合监控系统(Prometheus+Grafana)构建完整监控体系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值