Nginx负载均衡

发布时间:2024年01月16日

目录

Nginx负载均衡

1.定义

2.负载均衡的作用

3.upstream配置

4.负载均衡算法

5.nginx配置7层协议及4层协议方法

1.nginx配置7层协议

2.nginx配置4层协议

6.nginx会话保持

1、ip_hash


Nginx负载均衡

1.定义

负载均衡(Load Balance,简称 LB),是在现有网络结构之上分摊到多个操作单元上进行执行,扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

2.负载均衡的作用

高并发:负载均衡通过算法调整负载,尽力均匀的分配应用集群中各节点的工作量,以此提高应用集群的并发处理能力(吞吐量)。 伸缩性:添加或减少服务器数量,然后由负载均衡进行分发控制。这使得应用集群具备伸缩性。 高可用:负载均衡器可以监控候选服务器,当服务器不可用时,自动跳过,将请求分发给可用的服务器。这使得应用集群具备高可用的特性。

安全防护:有些负载均衡软件或硬件提供了安全性功能,如:黑白名单处理、防火墙,防 DDos 攻击等

3.upstream配置

被代理服务器地址有两种写法。

?upstream testapp { 
? ? ?  server 10.12.153.43:80;
? ? ?  server 10.12.153.220:80;
? ?  }
? server {
? ? ? ?  listen 80;
? ? ? ?  server_name localhost;
? ? ? ?  location / { ? ? ? ? 
? ? ? ? ? ? proxy_pass  http://testapp;  #请求转向 testapp 定义的服务器列表 ? ? ? ? 
? ? ? ?  } 
?upstream mysvr { 
? ? ?  server  http://10.12.153.43:80;
? ? ?  server  http://10.12.153.220:80;
? ?  }
? server {
? ? ? ?  listen 80;
? ? ? ?  server_name localhost;
? ? ? ?  location  / { ? ? ? ? 
? ? ? ? ? ? proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表 ? ? ? ? 
? ? ? ?  } 

4.负载均衡算法

upstream 支持4种负载均衡调度算法:

A、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;

B、ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。

C、url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。后台服务器为缓存的时候提高效率。

D、fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。

#配置实例

1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....

?upstream myweb { 
? ? ?  server 172.17.14.2:8080; 
? ? ?  server 172.17.14.3:8080 backup;  #热备 ? ? 
? ?  }

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

upstream myweb { 
? ? ?  server 172.17.14.2:8080;
? ? ?  server 172.17.14.3:8080;
? ?  }

3、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB....

?upstream myweb { 
? ? ?  server 172.17.14.2:8080 weight=1;
? ? ?  server 172.17.14.3:8080 weight=2;
?}

4、ip_hash:nginx会让相同的客户端ip请求相同的服务器。

?upstream myweb { 
? ? ?  server 172.17.14.2:8080; 
? ? ?  server 172.17.14.3:8080;
? ? ?  ip_hash;
? ?  }

5、nginx负载均衡配置状态参数

  • down,表示当前的server暂时不参与负载均衡。

  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

  • fail_timeout,在经历了max_fails次失败后,暂停服务的时间单位秒。max_fails可以和fail_timeout一起使用。

upstream myweb { 
? ? ?  server 172.17.14.2:8080 weight=2 max_fails=2 fail_timeout=2;
? ? ?  server 172.17.14.3:8080 weight=1 max_fails=2 fail_timeout=1; ? ?
? ?  }

5.nginx配置7层协议及4层协议方法

1.nginx配置7层协议

OSI(Open System Interconnection)是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范,共包含七层协议。直接上图,这样更直观些:

?#upstream块在http协议块里面
?upstream testapp {
?     ? ? ? server 10.12.153.43:80 weight=2 max_fails=2 fail_timeout=2s;
? ? ? ? ? ? server 10.12.153.220:80 weight=2 max_fails=2 fail_timeout=2s; ? ? ? ? ? ? ? 
?    }
??
? ? ? server {
?     ? ? ? listen    ?  81;
?    server_name www.app.com;
?    charset utf-8;
?    #access_log  logs/host.access.log  main;
?    location / {
?     ?  proxy_pass http://testapp;
? ? ? ? ? ?  proxy_set_header Host $host:$server_port;
? ? ? ? ? ?  proxy_set_header X-Real-IP $remote_addr;
? ? ? ? ? ?  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
2.nginx配置4层协议

TCP/IP协议 之所以说TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。

从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。

nginx在1.9.0的时候,增加了一个 stream 模块,用来实现四层协议(网络层和传输层)的转发、代理、负载均衡等。stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听,然后通过proxy_pass来转发我们的请求,通过upstream添加多个后端服务,实现负载均衡。

?#stream与http协议快同级
stream {
?            upstream myweb {
? ? ? ? ? ? ? ?  hash $remote_addr consistent;
? ? ? ? ? ? ? ?  server 172.17.14.2:8080;
? ? ? ? ? ? ? ?  server 172.17.14.3:8080;
? ? ? ?  }
? ? ? ?  server {
? ? ? ? ? ?  listen 82;
? ? ? ? ? ?  proxy_connect_timeout 10s;
? ? ? ? ? ?  proxy_timeout 30s;
? ? ? ? ? ?  proxy_pass myweb;
? ? ? ?  }
?}
6.nginx会话保持

nginx会话保持主要有以下几种实现方式。

1、ip_hash

ip_hash使用源地址哈希算法,将同一客户端的请求总是发往同一个后端服务器,除非该服务器不可用。

ip_hash语法:

?upstream backend {
? ?  ip_hash;
? ?  server backend1.example.com;
? ?  server backend2.example.com;
? ?  server backend3.example.com down;
?}

ip_hash简单易用,但有如下问题: 当后端服务器宕机后,session会丢失; 来自同一局域网的客户端会被转发到同一个后端服务器,可能导致负载失衡; 不适用于CDN网络,不适用于前段还有代理的情况。

文章来源:https://blog.csdn.net/zbw0323/article/details/135630994
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。