nginx tcp负载突破端口数量限制 proxy_bind split_client

前几日再网上看到一篇文章《复工后一次百万长连接压测Nginx与OOM的问题排查分析,我裂开了!》。标题很具有吸引力,内容也很有吸引力,链接我就不放了,有兴趣的朋友可以搜一下看看。

文章中描述使用了上百台Jmeter服务器来作为百万长连接客户端连接Nginx做压测。Nginx为4台集群,让我不禁感慨Nginx的强大。随后我有思考了一个问题,既然是长连接代理,jmeter client到Nginx集群的连接数达百万,那Nginx到后端服务器之间也应该是百万连接啊,那么是如何做到4台nginx服务器对后端服务发起了百万connect 长连接保持的呢?

tcp连接元组client [ip:port]-server[ip:port]

nginx作为中继服务器的时候身份是属于client的,那么ip就会被固定,server端ip:port也是固定,那么连接数就受限于Nginx服务器本身的port数量:65535(实际达不到,会有保留端口) ,4台服务器如何也达不到保持百万长连接。

那么文章所描述的百万长连接是否是吹嘘?

当然不是吹嘘,其实还是有办法达到的,让服务器突破端口限制,在此之前我也不知道如何,通过网上搜索和向高人请教,才得知,其实可以为Nginx服务器一个网卡配置多个ip,通过增加client端的ip数量来突破限制,配合Nginx的proxy_bind和split_client功能突破单机对外65535以及负载均衡的效果。下面介绍一下实现过程

前期准备

  1. 一台Nginx服务器(需要安装stream模块用于TCP代理转发)(ip为192.168.1.53)
  2. 一台TCP server(ip:port 192.168.1.83)
  3. 多个TCP client(可使用工具代替)

Nginx配置文件nginx.conf

#user nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;

events {
use epoll;
worker_connections 1024;
}

stream {
split_clients "$remote_addr$remote_port" $split_ip {
50% 192.168.1.53;
* 192.168.1.54;
}
upstream tcp_proxy {
server 192.168.1.83:8999;// 后端TCP server 地址
}
server {
listen 8998;// 监听8998端口
proxy_pass tcp_proxy;
proxy_bind $split_ip;
}
}

配置文件中split_clients添加了两个ip192.168.1.53,192.168.1.54,两个ip都为nginx服务器的ip,一个是原始配置ip,一个为后续添加的临时ip

192.168.1.54ip 为临时增加的

ifconfig ens33:1 192.168.1.54 netmask 255.255.255.0 up

通过一个简单的TCP client工具对nginx发起连接请求,只测试了5-6个连接就可以看到效果

可以看到后端服务打印的来自nginx连接的地址ip一部分是53,一部分是54

通过增加多个网卡或者ip则单台nginx对外发起的Connect成倍增加,突破65535限制。

文章比较简单,阅读需要有一些nginx的使用基础和tcp的理论知识,另外我不清楚文章开头提到的百万连接是否是通过这种方式实现的。我只是将自己学习的结果记录以及发出来,本人水平很浅,希望大家多多指正