0°

Nginx 之 ngx_http_upstream_module 模块

Nginx通过ngx_http_upstream_module模块用于定义可以由proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass和memcached_pass指令引用的服务器组。

官方实例

官方实例通过 upstream 来定义一个服务器组,组名称叫做 backend ,组内包含了五台节点,然后通过 proxy_pass 模块将客户端请求转发给 upstream 定义的服务器组(通过组名称转发)。

upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

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

upstream指令语法格式

upstream

Syntax:   upstream name { ... }
Context:    http

定义一组服务器,服务器可以监听不同的端口。此外,监听TCP和unix域套接字的服务器可以混合使用。
例如:

upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com  backup;
}

默认情况下,backend定义的后端服务器以加权轮询的方式分布,被称为wrr,相当于weight=1。

server指令语法格式

1.server
server用来定义服务器的地址和其他参数,地址可以指定为带可选端口的域名或IP地址,也可以指定为“unix:”前缀后的unix域套接字路径。如果没有指定端口,则使用端口80。解析为多个IP地址的域名同时定义多个服务器。

Syntax: server address [parameters];
Default:    —
Context:    upstream

2.weight
weight为权重,默认情况下weight为1,weight越大,nginx将请求调度到此后端服务器则越多,适用于后端服务器性能不一致的情况。

weight=number

3.max_conns
当前的服务器的最大并发连接数,限制到代理服务器的最大同时活动连接数。默认值为0,表示没有限制。

max_conns=number

4.max_fails
如果访问后端服务器失败,max_fails参数可以指定访问失败的最大次数;如果超出了指定次数,则将此后端服务器标记为不可用

max_fails=number

5.fail_timeout
每次访问后端服务器的超时时间,如果连续 max_fails 定义次数,每次超时时间 fail_timeout 则将服务器标记为不可用

fail_timeout=time

6.backup
将服务器标记为“备用”,即所有服务器均不可用时此服务器才启用。
该参数不能与 ip_hash、hash key、random算法一起使用。

backup  

7.down
将后端服务器标记为不可用,当后端服务器出问题时,可以使用此参数来标记节点为不可用

down

server指令实例
以下为server指令中常用的配置参数

upstream backend {
        server 192.168.31.240:8080 weight=3 max_conns=300 max_fails=3 fail_timeout=10s;
        server 192.168.31.241:8080 weight=3 max_conns=500 max_fails=3 fail_timeout=10s;
        server 192.168.31.242:8080 weight=5 max_conns=800 max_fails=3 fail_timeout=10s;
        server 192.168.31.243:8080 backup;
        server 192.168.31.244:8080 down;
}

负载算法

1.least_conn
least_conn为最少连接算法,在这种方法中,考虑到服务器的权重,将请求传递给活动连接数量最少的服务器。如果有多个这样的服务器,则依次使用加权循环平衡。

upstream backend {
        least_conn;
        server 192.168.31.240:8080 weight=3 max_conns=300 max_fails=3 fail_timeout=10s;
        server 192.168.31.241:8080 weight=3 max_conns=500 max_fails=3 fail_timeout=10s;
        server 192.168.31.242:8080 weight=6 max_conns=800 max_fails=3 fail_timeout=10s;
        server 192.168.31.243:8080 backup;
        server 192.168.31.244:8080 down;
}

2.least_time
least_time将请求传递给平均响应时间和活动连接数量较少的服务器,同时考虑到服务器的权重。如果有多个这样的服务器,则依次使用加权循环平衡。
如果指定了报头参数,则使用接收响应报头的时间。如果指定了last_byte参数,则使用接收完整响应的时间。
这种算法只在 NGINX PLUS 中才有的模式(付费版NGINX)

Syntax: least_time header | last_byte [inflight];
Default:    —
Context:    upstream
upstream backend {
        least_time header;
        #least_time last_byte;
        #least_time header inflight;
        #least_time last_byte inflight;
        server 192.168.31.240:8080 weight=3 max_conns=300 max_fails=3 fail_timeout=10s;
        server 192.168.31.241:8080 weight=3 max_conns=500 max_fails=3 fail_timeout=10s;
        server 192.168.31.242:8080 weight=6 max_conns=800 max_fails=3 fail_timeout=10s;
        server 192.168.31.243:8080 backup;
        server 192.168.31.244:8080 down;
}

3.ip_hash
在 IP Hash 模式下,NGINX 会根据发送请求的 IP 地址的 hash 值来决定将这个请求转发给哪个后端服务实例。被 hash 的 IP 地址要么是 IPv4 地址的前三个 16 进制数或者是整个 IPv6 地址。使用这个模式的负载均衡模式可以保证来自同一个 IP 的请求被转发到同一个服务实例上,可以解决session的问题,但是ip_hash会造成负载不均,假如两个不同地址连接到了两个不同服务器,如果有一个地址发出的请求很多,而另一个地址发出的请求很少,则会造成负载不均。除非该服务器不可用,如果不可用,客户机请求将被传递到另一个服务器。

upstream backend {
        ip_hash;
        server 192.168.31.240:8080 weight=3 max_conns=300 max_fails=3 fail_timeout=10s;
        server 192.168.31.241:8080 weight=3 max_conns=500 max_fails=3 fail_timeout=10s;
        server 192.168.31.242:8080 weight=6 max_conns=800 max_fails=3 fail_timeout=10s;
        server 192.168.31.243:8080;
        server 192.168.31.244:8080 down;
}

4.hash key [consistent]
自定义hash的两种用法

  1. hash key 是nginx自带的负载均衡,key可以是文本、变量及其组合,hash后面跟什么就绑定什么来做hash保持。
  2. hash key consistent后面多了一个consistent 这个关键词会使用一种新的 hash 算法,被称为为一致性 hash 算法,一致性hash算法使用ketama,该方法确保在向组中添加或从组中删除服务器时,只有少数几个密钥将被重新映射到不同的服务器,这有助于为缓存服务器实现更高的缓存命中率。关于更多一致性hash算法请参考 https://blog.csdn.net/publicv/article/details/104732046
#hash key 通过 NGINX 内置变量 $remote_addr 进行会话保持,如果用$remote_addr的话就与ip_hash算法功能一致了
upstream backend {
        hash $remote_addr;
        server 192.168.31.240:8080 weight=3 max_conns=300 max_fails=3 fail_timeout=10s;
        server 192.168.31.241:8080 weight=3 max_conns=500 max_fails=3 fail_timeout=10s;
        server 192.168.31.242:8080 weight=6 max_conns=800 max_fails=3 fail_timeout=10s;
        server 192.168.31.243:8080;
        server 192.168.31.244:8080 down;
}

#hash key 通过 NGINX 内置变量 $request_uri 进行会话保持,根据每次请求的URI地址,hash后访问到固定服务器节点,如果URI发生改变就可能负载到别的后端服务器,这种模式后端服务器为缓存时比较好
upstream backend {
        hash $request_uri;
        server 192.168.31.240:8080 weight=3 max_conns=300 max_fails=3 fail_timeout=10s;
        server 192.168.31.241:8080 weight=3 max_conns=500 max_fails=3 fail_timeout=10s;
        server 192.168.31.242:8080 weight=6 max_conns=800 max_fails=3 fail_timeout=10s;
        server 192.168.31.243:8080;
        server 192.168.31.244:8080 down;
}

#hash key consistent 这种hash一致性算法使用了ketama,算法上比以上复杂一些,也是根据每次请求的URI地址进行hash
upstream backend {
        hash $request_uri consistent;
        server 192.168.31.240:8080 weight=3 max_conns=300 max_fails=3 fail_timeout=10s;
        server 192.168.31.241:8080 weight=3 max_conns=500 max_fails=3 fail_timeout=10s;
        server 192.168.31.242:8080 weight=6 max_conns=800 max_fails=3 fail_timeout=10s;
        server 192.168.31.243:8080;
        server 192.168.31.244:8080 down;
}

其它参数

1.keepalive
keepalive参数设置到保存在每个工作进程缓存中的上游服务器的最大空闲保持连接数,当超过此数目时,最近最少使用的连接将被关闭。
keepalive指令并没有限制nginx工作进程可以打开的到上游服务器的连接总数。连接参数应该设置为足够小的数字,以便上游服务器也可以处理新的传入连接。

upstream backend {
        hash $request_uri consistent;
        keepalive 30;
        server 192.168.31.240:8080 weight=3 max_conns=300 max_fails=3 fail_timeout=10s;
        server 192.168.31.241:8080 weight=3 max_conns=500 max_fails=3 fail_timeout=10s;
        server 192.168.31.242:8080 weight=6 max_conns=800 max_fails=3 fail_timeout=10s;
        server 192.168.31.243:8080;
        server 192.168.31.244:8080 down;
}

2.keepalive_requests
设置为每个keepalive连接提供最大的请求数,超过最大请求数量之后,连接关闭。
为了释放每个连接的内存分配,需要周期性地关闭连接,因此,使用过高的最大请求数可能会导致过多的内存使用,不建议这样做。

upstream backend {
        hash $request_uri consistent;
        keepalive 30;
        keepalive_requests 300;
        server 192.168.31.240:8080 weight=3 max_conns=300 max_fails=3 fail_timeout=10s;
        server 192.168.31.241:8080 weight=3 max_conns=500 max_fails=3 fail_timeout=10s;
        server 192.168.31.242:8080 weight=6 max_conns=800 max_fails=3 fail_timeout=10s;
        server 192.168.31.243:8080;
        server 192.168.31.244:8080 down;
}

3.keepalive_timeout
设置一个超时,在此期间,到上游服务器的空闲keepalive连接将保持打开状态,如果超出了该时间,则断开与后端服务器的空闲连接。

upstream backend {
        hash $request_uri consistent;
        keepalive 30;
        keepalive_requests 300;
        keepalive_timeout 60s;
        server 192.168.31.240:8080 weight=3 max_conns=300 max_fails=3 fail_timeout=10s;
        server 192.168.31.241:8080 weight=3 max_conns=500 max_fails=3 fail_timeout=10s;
        server 192.168.31.242:8080 weight=6 max_conns=800 max_fails=3 fail_timeout=10s;
        server 192.168.31.243:8080;
        server 192.168.31.244:8080 down;
}






「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论