测试环境
- centos7.5
- nginx-1.14.2
- nginx安装目录:/usr/local/nginx
- nginx源代码目录:/root/setup/nginx-1.14.2
介绍
跨多个应用程序实例的负载平衡是一种常用的技术,用于优化资源利用率、最大化吞吐量、减少延迟和确保容错配置。
可以使用nginx作为一个非常有效的HTTP负载均衡器,将流量分配到多个应用服务器,并使用nginx提高web应用程序的性能、可伸缩性和可靠性。
nginx负载均衡机制
nginx默认支持4种负载均衡机制:
- 循环机制(round-robin),对应用服务器的请求以循环的方式进行分发
- 最少连接机制(least-connected),对应用服务的请求分发给当前连接数最少的服务器
- ip-hash机制(ip-hash),通过hash算法,将请求分发给固定的服务器
- 权重机制(weighted load balancing),按照权重大小,对请求进行分发,权重大的服务器处理的请求占比多
创建/root/web/app1,/root/web/app2,/root/web/app3目录,分别模拟三个应用程序。在三个目录中分别上传index.html文件,index.html分别输出app1、app2、app3。修改"/usr/local/nginx/conf/nginx.conf"配置文件,在http节点下添加三个server节点:
1 # app1 2 server { 3 listen 8080; 4 server_name localhost; 5 location / { 6 root /root/web/app1; 7 } 8 } 9 10 # app2 11 server { 12 listen 8081; 13 server_name localhost; 14 15 location / { 16 root /root/web/app2; 17 } 18 } 19 20 # app3 21 server { 22 listen 8082; 23 server_name localhost; 24 25 location / { 26 root /root/web/app3; 27 } 28 }
循环机制(round-robin)
在http节点下添加如下配置节点
1 upstream app { 2 server localhost:8080; //app1 3 server localhost:8081; //app2 4 server localhost:8082; //app2 5 } 6 7 server { 8 listen 80; 9 server_name localhost; 10 location / { 11 proxy_pass http://app; //app是upstream节点后的key取值 12 } 13 }
保存nginx.conf配置文件,重新加载配置文件
1 /usr/local/nginx/sbin/nginx -t; 2 /usr/local/nginx/sbin/nginx -s reload;
当访问http://server_name时,请求会大体均衡的分发给:localhost:8080,localhost:8081,localhost:8082。
最少连接机制(least-connected)
nginx中使用最少连接机制需要"least_conn"指令来激活,
1 upstream app { 2 least_conn; 3 server localhost:8080; //app1 4 server localhost:8081; //app2 5 server localhost:8082; //app2 6 }
当接收到请求后,请求会被分发给当前负载量最少的服务器
ip-hash机制(ip-hash)
循环机制、最少连接机制针对同一个客户端发送的请求可能会被分发给不同的服务器,但是在一些场景中需要将同一个客户端的请求分发给固定的服务器,那个可以使用ip-hash机制来实现此功能。
1 upstream app { 2 ip_hash; 3 server localhost:8080; //app1 4 server localhost:8081; //app2 5 server localhost:8082; //app2 6 }
当接收到请求后,请求会被分发给当前负载量最少的服务器
权重机制(weighted load balancing)
在实际场景中,应用程序所在的服务器集群的配置性能可能差距很大,那么配置好的服务器自然也需要处理较多的请求才能发挥出价值,此时就可以通过“权重机制”来完成
1 upstream app { 2 server localhost:8080 weight=3; //app1 3 server localhost:8081; //app2 4 server localhost:8082; //app2 5 }
如上配置,如果5个请求,3个请求分发给localhost:8080,另外两个分发给localhost:8081、localhost:8082. 对于"最少连接机制"、"ip-hash机制"的权重机制配置语法如上配置一样。
健康检查
nginx健康检查主要是通过“max_fails"和“fail_timeout”指令来控制。
1 upstream app { 2 server localhost:8080 weight=3 fail_timeout=10 max_fails=1; //app1 3 server localhost:8081; //app2 4 server localhost:8082; //app2 5 }
如果fail_timeout的次数超过了max_fails的值,nginx则认为该服务不可达,后续的请求则不会分发给该服务。后面nginx会定时检测不可达的服务是否可达,如果可达,则将其激活,分发请求。 保存nginx.conf配置文件,重新加载配置文件
1 /usr/local/nginx/sbin/nginx -t; 2 /usr/local/nginx/sbin/nginx -s reload;