[转帖]无涯教程: Nginx - HTTP负载平衡介绍

无涯,教程,nginx,http,负载平衡,介绍 · 浏览次数 : 0

小编点评

**Nginx Plus会话持久性** **1. 会话标识符** * sticky cookie * route cookie **2. 会话启动** * 服务器在收到第一个请求时分配一个唯一的会话标识符 * 将会话标识符存储在客户端的cookie中 * 向上游服务器发送会话标识符 **3. 会话维护** * 客户端在响应中设置会话标识符 * 上游服务器根据会话标识符找到对应的服务器 * 向服务器发送后续请求 **4. 会话持久性** * 客户端在响应中设置会话标识符 * 上游服务器根据会话标识符找到对应的服务器 * 向上游服务器发送后续请求 **5. 示例** ```nginx sticky session id client_sessions:1m; server 192.0.0.1; route a; route b; sticky learn; create $upstream_cookie_examplecookie; lookup $cookie_examplecookie; zone client_sessions:1m; timeout 1h; ``` **6. 总结** Nginx Plus支持会话持久性,允许客户端在响应中设置会话标识符并向上游服务器发送后续请求。会话标识符用于存储会话状态,并允许客户端在响应中恢复之前的所有请求。

正文

https://www.imooc.com/article/318916

 

集群代理池

在开始使用Nginx或Nginx Plus负载均衡HTTP流量到一组服务器之前,首先,我们需要使用上游(upstream)指令定义该组。该指令位于http上下文(context)中。

使用server指令配置组中的服务器。让我们来看一个示例,以下配置定义了一个名为backend的组,它由三台服务器配置组成,这些服务器配置可以解析三个以上的实际服务器。

http {    upstream backend {        server backend1.example.com weight=5;        server backend2.example.com;        server 192.0.0.1 backup;
    }
}

要将请求传递到服务器组,请在 proxy_pass 指令中指定组名。在下面的示例中,运行在Nginx上的虚拟服务器将所有请求传递到上游后端组(upstream backend group)。

server {
    location/{
        proxy_pass http://backend;
    }}

以下示例结合了上面的两个代码片段,并说明了如何将HTTP请求代理到后端(backend)服务器组。该组由三台服务器组成,同一应用程序的两个实例,而第三个是备份服务器。由于在上游块中未指定负载均衡算法,因此Nginx使用默认算法Round Robin。

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server 192.0.0.1 backup;
    }
    
    server {
        location/{
            proxy_pass http://backend;
        }
    }}

负载均衡方法

Nginx开源支持四种负载均衡方法,而Nginx Plus又增加了两种方法:

1. Round Robin  -  在这种方法中,考虑到服务器的权重,请求在服务器之间平均分配。没有启用它的指令。默认情况下使用此方法。

upstream backend {   # no load balancing method is defined for Round Robin
   server backend1.example.com;
   server backend2.example.com;}

2.Least Connections(最少连接数) - 将考虑到服务器权重的活动连接数最少的请求发送到服务器。

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;}

3. IP Hash - 此方法用于确定应为下一个请求选择哪个服务器。在这种情况下,将使用IPv4地址的前三个八位位组或整个IPv6地址来计算哈希值。

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

如果其中一台服务器需要暂时从负载平衡循环中删除,则可以将其与down参数一起添加,以保留客户端IP地址的当前哈希值。

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

4. 通用哈希值(Generic Hash)  - 将请求发送到的服务器是根据用户定义的键确定的,该键可以是字符串,文本,变量或组合。

upstream backend {    hash $request_uri consistent;    server backend1.example.com;    server backend2.example.com;
}

Nginx Plus支持另外两种方法:

5. 最短时间(Least Time)  -  对于每个请求,Nginx都会选择具有最低平均延迟和最少活动连接数的服务器,其中,最低延迟是根据在minimum_time指令中包含的以下参数计算出来的。

  • header             - 是从服务器接收1 st 字节的时间。

  • last_byte         -  是时候接受来自服务器的完整响应了。

  • last_byte inflight  - 考虑到请求不完整,该时间从服务器接收完整响应的时间。

upstream backend {
    least_time header;
    server backend1.example.com;
    server backend2.example.com;}

6. Random   -  在这种方法中,每个请求都将传递到随机选择的服务器。如果指定了2个参数,则第一个nginx会考虑服务器权重来随机选择两个服务器,然后使用指定的方法选择这些服务器之一:

  • Least_conn                       - 活动连接数最少。

  • least_time = header      - 从服务器接收响应标头的最短平均时间。

  • Least_time = last_byte - 从服务器接收完整响应的最短平均时间。

upstream backend {
    random two least_time=last_byte;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;}

服务器权重

默认情况下,Nginx使用权重通过Round Robin方法在组中的服务器之间分配请求。 server指令的weight参数用于设置服务器的 weight 。默认情况下的权重是1。

upstream backend {    server backend1.example.com weight=5;    server backend2.example.com;    server 192.0.0.1 backup;
}

在上面的示例中,backend1.example.com的权重为5,其他两台服务器的权重为默认权重1,但IP地址为192.0.0.1的那一台被标记为备份服务器,并且不接收请求,除非其他两个服务器都不可用。在这种权重配置中,每6个请求中,有5个发送到 backend1.example.com ,有1个发送到 backend2.example.com 。

服务器慢启动

服务器缓慢启动用于防止最近恢复的服务器被连接淹没,连接可能会超时并导致服务器再次标记为故障。

在Nginx Plus中,慢速启动允许上游服务器在恢复或可用后将其权重从0逐渐恢复到其标称值。为此,请对server指令使用slow_start参数。

upstream backend {    server backend1.example.com slow_start=30s;    server backend2.example.com;    server 192.0.0.1 backup;
}

启用会话持久性

Nginx Plus识别用户会话,并将给定会话中的所有请求路由到同一上游服务器。这称为会话持久性。

Nginx Plus使用三会话持久性方法。这些方法是通过 sticky 指令设置的。

Sticky Cookie

Nginx Plus包含来自上游组的第一个响应的会话cookie,并标识发送响应的服务器。客户端的下一个请求包含cookie值,并且Nginx Plus将请求路由到响应第一个请求的上游服务器。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    sticky cookie srv_id expires=1h domain=.example.com path=/;}

在上面的示例中, srv_id 参数用于设置Cookie的名称。

expires - 参数是可选参数,用于设置浏览器保留Cookie的时间。

domain - 定义为其设置Cookie的域。

path       -  也是可选参数。它定义了设置cookie的路径。

sticky cookie是最简单的会话持久性方法。

Sticky Route

当Nginx Plus收到第一个请求时,它将为客户端分配一条路由。将所有后续请求与server指令的route参数进行比较,以标识将请求代理到的服务器。路由信息来自cookie或请求URI。

upstream backend {    server backend1.example.com route=a;    server backend2.example.com route=b;    sticky route $route_cookie $route_uri;
}

Cookie 学习

首先,Nginx Plus通过检查请求和响应来查找会话标识符。然后Nginx Plus 学习哪个上游服务器对应于哪个会话标识符。通常,这些标识符在HTTP cookie中传递。如果一个请求的会话标识符已经学习,Nginx Plus会将请求转发到相应的服务器。

upstream backend {
   server backend1.example.com;
   server backend2.example.com;
   sticky learn
       create=$upstream_cookie_examplecookie
       lookup=$cookie_examplecookie
       zone=client_sessions:1m
       timeout=1h;}

在上面,上游服务器之一通过在响应中设置cookie EXAMPLECOOKIE 来创建会话。

与[转帖]无涯教程: Nginx - HTTP负载平衡介绍相似的内容:

[转帖]无涯教程: Nginx - HTTP负载平衡介绍

https://www.imooc.com/article/318916 集群代理池 在开始使用Nginx或Nginx Plus负载均衡HTTP流量到一组服务器之前,首先,我们需要使用上游(upstream)指令定义该组。该指令位于http上下文(context)中。 使用server指令配置组中的

[转帖]火焰图基本使用教程

火焰图基本使用教程 1. 基本流程 下载FlameGrapth包:https://github.com/brendangregg/FlameGraph,无需安装,直接使用。也可以直接使用命令git clone https://github.com/brendangregg/FlameGraph.gi

[转帖]docker进阶教程之dockerfile优化镜像大小

https://www.jb51.net/hack/ 同样功能的镜像,但是不同的Dockerfile build出来的镜像大小是不一样的,下面这篇文章主要给大家介绍了关于docker进阶教程之dockerfile优化镜像大小的相关资料,需要的朋友可以参考下 + 目录 一、无优化构建镜像 1 2 3

[转帖]Win11激活怎么跳过联网?Win11跳过联网激活图文教程

https://www.zmtc.com/pc/3876.html 从Windows 11开始,微软要求用户需先联网激活系统才能进入桌面,这导致没有网络环的用户就无法完成激活步骤。此外,很多电商平台销售的笔记本,一旦联网激活过,就不再提供7天无理由退货。所以很多用户都希望Win11能跳过联网激活,今

[转帖]Jmeter连接InfluxDB2.0.4

Jmeter连接InfluxDB2.0.4 问题描述:在用Jmeter+InfluxDB构建监控时,因为docker构建的InfluxDB的版本是2.0.4,按照网上的教程进行后端监听器的填写,但是一直出现错误提示401等问题。网上的教程大多是1.X版本的,怀疑是数据库版本不一致导致的数据无法写入,

[转帖]编译实战 | 手摸手教你在Windows环境下运行Redis6.x

原创:微信公众号 码农参上,欢迎分享,转载请保留出处。 哈喽大家好啊,我是没事就愿意瞎捣鼓的Hydra。 不知道有没有小伙伴像我一样,平常开发中用的是windows操作系统,有时候想装点什么软件,一看只支持linux系统,无奈要么启动虚拟机、要么装在云服务器上。 这不前几天又是这样,刚想用一下Red

[转帖]Linux句柄调优之nofile、nr_open、file-max

https://www.jianshu.com/p/8fb056e7b9f8 在开发运维的时候我们常常会遇到类似“Socket/File: Can’t open so many files”,“无法打开更多进程”,或是coredump过大等问题,这些都可以设置资源限制来解决。今天在教某位客户设置最大

[转帖]Linux句柄调优之nofile、nr_open、file-max

https://www.jianshu.com/p/8fb056e7b9f8 在开发运维的时候我们常常会遇到类似“Socket/File: Can’t open so many files”,“无法打开更多进程”,或是coredump过大等问题,这些都可以设置资源限制来解决。今天在教某位客户设置最大

[转帖]Linux句柄调优之nofile、nr_open、file-max

https://www.jianshu.com/p/8fb056e7b9f8 在开发运维的时候我们常常会遇到类似“Socket/File: Can’t open so many files”,“无法打开更多进程”,或是coredump过大等问题,这些都可以设置资源限制来解决。今天在教某位客户设置最大

[转帖]无线标准802.11ac 和 802.11ax到底有什么区别?哪个更快?

https://bbs.huaweicloud.com/blogs/382897 【摘要】 802.11ac 和 802.11ax 是目前来说比较常用的无线 (WiFi) 技术标准,最常见的无线标准称为 802.11ac,也就是 WiFi 5,然而,在 2019 年底,推出了 802.11ax,也就