Nginx负载均衡模块简述
Nginx 负载均衡是由代理模块和上游(upstream)模块共同实现的,Nginx 通过代理模块的反向代理功能将用户请求转发到上游服务器组,上游模块通过指定的负载均衡策略及相关的参数配置将用户请求转发到目标服务器上。上游模块可以与 Nginx 的代理指令(proxy_pass)、FastCGI 协议指令(fastcgi_pass)、uWSGI 协议指令(uwsgi_pass)、SCGI 协议指令(scgi_pass)、memcached 指令(memcached_pass)及 gRPC 协议指令(grpc_pass)实现多种协议后端服务器的负载均衡。
1、服务器配置指令
Nginx 上游模块定义了 upstream 指令域,在该指令域内可设置服务器、负载均衡策略等负载均衡配置,配置样例如下,具体指令说明如下面表格中所示。
upstream backend {
server backend1.example.com weight=5; # 被代理服务器端口号为80,权重为5
server backend2.example.com:8080; # 被代理服务器端口号为8080,默认权重为1
server unix:/tmp/backend3;
server backup1.example.com:8080 backup; # 该被代理服务器为备份状态
server backup2.example.com:8080 backup; # 该被代理服务器为备份状态
}
server {
location / {
proxy_pass http://backend; # 将客户端请求反向代理到上游服务器组backend
}
}
表:服务器指令
关于上表有以下几点需要注意:
- 服务器地址可以是指定端口的 IP、域名或 Unix 套接字;
- 如不指定端口,默认端口号为 80。
表:服务器指令参数
其中,slow_start 参数不能与 Hash 负载均衡方法一同使用;若上游服务器组中只有一台被代理服务器,则 max_fails、fail_timeout 和 slow_start 参数都会被忽略,并且这个服务器将永远不会被置为无效。
表:共享内存区指令
表:长连接最大请求数指令
表:长连接缓存数
注意:该指令不会对活跃的 TCP 连接数有影响。
表:长连接缓存超时时间
2、负载均衡策略指令
Nginx 支持多种负载均衡策略,如轮询(Round Robin)、一致性哈希(Consistent Hash)、IP 哈希(IP Hash)、最少连接(least_conn)等。Nginx 的默认负载均衡策略为轮询策略,不需要配置指令,轮询策略通过 server 的权重参数可实现手动分配的加权轮询策略。
负载均衡策略配置指令均应编辑在 upstream 指令域的最上方,常见的配置指令如下面表格中所示。
表:哈希策略
配置样例如下:
upstream backend {
hash $request_uri; # 以客户端请求URI为计算哈希值的key
...
}
upstream backend {
hash $request_uri consistent; # 以客户端请求URI为计算哈希值的key,采用一致性哈希算法
...
}
表:IP 哈希策略
配置样例如下:
upstream backend {
ip_hash; # 启用IP哈希负载均衡策略
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
当服务器组中一台服务器被临时删除时,可使用 down 参数标记,那么客户端 IP 哈希值将会保留。
表:最少连接策略
配置样例如下:
upstream backend {
least_conn; # 启用最少连接负载均衡策略
server backend1.example.com;
server backend2.example.com;
server backend4.example.com;
}
表:随机负载策略
配置样例如下:
upstream backend {
random; # 每个请求都被随机发送到某个服务器
server backend1.example.com;
server backend2.example.com;
server backend4.example.com;
}
指令值参数 two,该参数表示随机选择两台被代理服务器,然后使用指定的负载策略进行选择,默认方法为 least_conn;可被指定的负载策略为 least_conn、least_time(仅对商业版有效)。