本文概述
将HTTP流量代理到一组服务器
在开始使用Nginx开源或Nginx Plus负载均衡HTTP流量到一组服务器之前, 首先, 我们需要使用上游指令定义该组。该指令位于http上下文中。
使用server指令配置组中的服务器。让我们来看一个示例, 以下配置定义了一个名为backend的组, 它由三个服务器配置组成, 这些服务器配置可以解析三个以上的实际服务器。
http {
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server 192.0.0.1 backup;
}
}
要将请求传递到服务器组, 请在proxy_pass指令中指定组名。在下面的示例中, 运行在Nginx上的虚拟服务器将所有请求传递到上游后端组。
server {
location / {
proxy_pass http://backend;
}
}
以下示例结合了以上两个片段, 并展示了如何将HTTP请求代理到后端服务器组。该组包括三台服务器, 同一应用程序的两个实例, 而第三台是备份服务器。由于上游块中未指定负载均衡算法, 因此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.循环:在这种方法中, 请求在服务器之间平均分配, 同时考虑了服务器权重。没有启用它的指令。默认情况下使用此方法。
upstream backend {
# no load balancing method is defined for Round Robin
server backend1.example.com;
server backend2.example.com;
}
2.最少连接:考虑到服务器权重, 将使用最少活动连接数的请求发送到服务器。
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
3. IP哈希:此方法用于确定应为下一个请求选择哪个服务器。在这种情况下, 将使用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.通用哈希:向其发送请求的服务器是根据用户定义的键确定的, 该键可以是字符串, 文本, 变量或组合。例如, 密钥可以是成对的源IP地址和端口, 或者密钥可以是URI, 如以下示例所示:
upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
Nginx Plus支持另外两种方法:
5.最短时间:对于每个请求, Nginx都会选择具有最低平均延迟和最低活动连接数的服务器, 其中, 最低平均延迟是根据minimum_time指令中包含的以下参数计算出来的。
- header:从服务器接收第一个字节的时间。
- last_byte:接受服务器的完整响应的时间。
- last_byte进行中:考虑到未完成的请求, 从服务器接收完整响应的时间。
upstream backend {
least_time header;
server backend1.example.com;
server backend2.example.com;
}
6.随机:在此方法中, 每个请求将传递到随机选择的服务器。如果指定了2个参数, 则第一个nginx将考虑服务器权重, 随机选择两个服务器, 然后使用指定的方法选择这些服务器之一:
- Least_conn-最少活动连接数。
- minimum_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参数用于设置服务器的权重。默认情况下的权重是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指令设置的。
粘饼干
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的时间。
也是可选参数的域定义为其设置cookie的域。
路径也是可选参数。它定义了设置cookie的路径。
粘性cookie是最简单的会话持久性方法。
粘性路线
当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来创建会话。