Nginx负载均衡

目录

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配置

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

bash 复制代码
 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.....

bash 复制代码
 upstream myweb { 
       server 172.17.14.2:8080; 
       server 172.17.14.3:8080 backup;  #热备     
     }

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

bash 复制代码
upstream myweb { 
       server 172.17.14.2:8080;
       server 172.17.14.3:8080;
     }

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

bash 复制代码
 upstream myweb { 
       server 172.17.14.2:8080 weight=1;
       server 172.17.14.3:8080 weight=2;
 }

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

bash 复制代码
 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一起使用。

bash 复制代码
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协议块里面
bash 复制代码
 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协议快同级
bash 复制代码
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语法:

bash 复制代码
 upstream backend {
     ip_hash;
     server backend1.example.com;
     server backend2.example.com;
     server backend3.example.com down;
 }

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

相关推荐
像名字一样难取的昵称25 分钟前
Linux学习笔记:十八、Linux文件的压缩,解压缩一站式学习
linux·运维·笔记·学习·ubuntu·ssh
Trouvaille ~2 小时前
【Linux】库制作与原理(二):ELF格式与静态链接原理
linux·运维·c语言·操作系统·动静态库·静态链接·elf文件
写代码的橘子n2 小时前
IPV6复习(基础入手版)
运维·服务器·网络
ICT技术最前线2 小时前
H3C双WAN口策略路由配置技术教程
运维·网络·h3c·策略路由
一分半心动2 小时前
windows docker desktop 安装VibeVoice
运维·docker·容器
向日葵.3 小时前
中间件交接文档
linux·运维·服务器
LucidX3 小时前
Docker核心操作实战
运维·docker·容器
隔壁阿布都3 小时前
Docker Compose中的网络管理
运维·docker·容器
云和数据.ChenGuang3 小时前
运维工程师技术教程之Pull Requests(PR)
运维·分布式·git·数据库运维工程师·运维教程
小快说网安3 小时前
抗 DDoS 防护在等保测评中的权重提升:云服务器如何通过防护能力加分?
运维·服务器·ddos·等保测评