nginx负载均衡详解

HTTP负载均衡

负载均衡通过upstream模块(自带)来实现,模块中配置多台服务器,并根据一定的策略实现负载均衡,upsteam一般可以有两种方式配置:

  • 直接配置在nginx.conf中的http{}中,与server{}同级
  • 单独定义一个upsteam.conf,通过include引入到http{}中,名字不一定是upstream.conf

1、热备:

如果被代理的服务器有两台, 当一台服务器发生故障时,才启用第二台服务器提供服务,配置如下:

说明:上图配置后,每次请求都会指向到10.9.2.79,当此机器发生故障的时候才会请求到10.9.2.80,一般适用小流量请求服务,当故障机器修好了又会重新提供服务

2、轮询:

nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序: ABABAB

上图中的upstream中保持默认配置即可

3、加权轮询:

根据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1 。

上图中设置2.79的权重为2、设置2.80的权重为8,表示如果请求10次,那么有8次到2.80上,2次到达2.79上

4、 ip_hash:

nginx会让相同的客户端ip请求相同的服务器,ip_hash只适用于HTTP负载

如果客户端第一次请求的是2.79,那么将会一直请求2.79,除非2.79挂掉才会请求2.80,当2.79恢复后 客户端 还会重新请求回2.79

还有几个其他常用参数如下:

  • down:表示当前的server暂时不参与负载均衡
  • max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
  • fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用

TCP负载均衡

TCP负载均衡需要使用stream模块(非自带,需要编译安装指定–with-stream)和upstream模块实现

代理目的:将192.168.49.83:3929端口代理到192.168.49.82:22端口

1、在conf.d同级目录下创建自定义目录stream.conf.d,定义streamtcp.conf,如下:

注:为什么要单独创建stream.conf.d而不是将streamtcp.conf放在conf.d中?因为conf.d是加载到http模块中,http和stream是在OSI模型的不同层上运行,http主要运行在应用层(第七层),stream运行在传输层(第四层),因此单独创建一个stream.conf.d并存放代理的tcp/udp端口文件

2、编辑streamtcp.conf,监听本机的3929端口并代理到192.168.49.82机器上的22端口,如图:

注:TCP负载中的upstream指令与http负载指令相似,也支持多个server,weight,backup模式,并支持轮询、最少连接、通用哈希、随机等负载均衡方法

3、修改nginx.conf,添加stream模块并导入配置文件,如图:

注:stream与http模块是平级关系,不要放在http模块里面

4、最后我们验证下,通过xshell连接92.168.49.83的3929端口并输入49.82的账号和密码,如图:

从上图可以看出,代理成功,要注意防火墙开放端口,如果是容器运行的NGINX要映射端口

注意:上图中的stream还有一种写法,就是在streamtcp.conf中用stream模块包裹,然后nginx.conf中直接使用include引入,如图:

UDP负载均衡

NGINX的stream模块和upstream模块还可以对UDP进行负载均衡

代理目的:将192.168.49.83的UDP协议端口3999代理到49.82的3888端口

1、继续使用上面的NGINX,创建streamudp.conf,如图:

注:UDP代理也是支持weight,backup,并支持轮询、最少连接、通用哈希、随机等负载均衡方法

2、在Linux命令行验证UDP数据,首先单独找一台机器,通过nc命令,向192.168.49.83的3999端口发送数据,然后在49.82机器通过命令接收UDP数据,如图:

在49.82机器来接受数据,如图:

从上图看出已经接收到数据,反向发送数据也是可以的

常用的参数还有:

  • proxy_timeout 30s; 配置超时时间30s,后端服务器在指定时间内未响应,则NGINX将中断连接
  • proxy_connect_timeout:设置与后端服务器建立连接的超时时间
  • proxy_responses 3; 每个请求最多3个响应,如果设置为0,则关闭连接

标签