概述
- Nginx 通过反向代理可以实现后端上游服务实例间的负载均衡, 将请求按照相应的负载均衡策略转发到不同的服务器上, 达到负载的效果, 避免了后端服务实例的单点故障; 目前
- Nginx 内置策略: rr, wrr, hash, ip_hash, least_conn
- Nginx 第三方模块支持的策略: fair, consistent_hash
部署环境
- nginx-1.20.1
- CentOS Linux release 7.6.1810
反向代理
1、Nginx 反向代理配置示例
upstream app1 { server 192.168.31.13:8081 weight=5 max_fails=3 fail_timeout=15s; server 192.168.31.17:8081 weight=5 max_fails=3 fail_timeout=15s; server 192.168.31.12:80 max_conns=1000; } upstream app2 { server 192.168.31.13:8082 weight=5 max_fails=3 fail_timeout=15s; server 192.168.31.17:8082 weight=5 max_fails=3 fail_timeout=15s; check interval=3000 rise=2 fall=5 timeout=1000 type=http; } server { listen 80; access_log /var/log/nginx/access.80.log main; location /app1/ { proxy_pass http://app1/; proxy_set_header Host $host; } location /app2/ { proxy_pass http://app2/; proxy_set_header Host $host; } }
2、配置项解析
weight=5; # 设置服务器的权重,默认为 1 fail_timeout=15s # 请求失败超时时间,在经历了max_fails次失败后,该服务器暂停服务的时间 max_fails=3 fail_timeout=15s; # 请求失败的次数超过 3 次后, nginx 将在接下来的 15s 内不会向该服务器派发请求 backup; # 指定该服务器组的备份机,其它服务器全挂了,才会派发请求给该服务器 down; # 标识该服务器不可用 max_conns=1000; # 限制到代理服务器的最大同时活动连接数。默认为 0,表示不限制; 如果服务器组不驻留在共享内存中,则限制适用于每个工作进程 keepalive 32; # 每个工作进程缓存到上游服务器空闲保持连接的最大数量 proxy_next_upstream error timeout http_502; # 指定在哪种情况下将请求传递到下一个服务器
负载均衡策略
rr
轮询(round robin)是 upstream 的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器, 如果某个后端服务器 down 掉后,能自动剔除。
upstream backend { server 192.168.31.101; server 192.168.31.102; server 192.168.31.103; }
wrr
权重轮询 weighted round-robin; 轮询的加强版,即可以指定轮询比率,weight 和访问几率成正比
upstream backend { server 192.168.31.101 weight=3; server 192.168.31.102 weight=2; server 192.168.31.103 weight=5; }
url_hash
按请求 url 的 hash 值来分配请求,使每个 url 定向到同一个后端服务器, 为了使得缓存命中率提高,很适合使用 url_hash 策略 1.7.2 版本以后,url_hash 模块已经集成到了 nginx 源码当中,不需要单独安装。之前的版本仍需要单独安装,下载地址:https://github.com/evanmiller/nginx_upstream_hash;
upstream tomcats { hash $request_uri; # hash $request_uri consistent; # url 一致性 hash server 192.168.31.100; server 192.168.31.101; server 192.168.31.102; }
ip_hash
每个请求按访问 IP 的哈希结果分配,使来自同一个 IP 的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的 session 共享问题
upstream backend { ip_hash; server 192.168.31.101; server 192.168.31.102; server 192.168.31.103; }
least_conn
将请求分配给活动连接数最少的服务器
upstream backend { least_conn; server 192.168.31.101; server 192.168.31.102; server 192.168.31.103; }
fair
根据服务器的响应时间来分配请求,响应时间短的优先分配,即负载压力小的优先会分配
# 部署 git clone https://github.com/gnosek/nginx-upstream-fair ./configure --add-module=/root/src/nginx-upstream-fair-master make -j2 && make install # 版本问题:如果使用的 Nginx 版本 >= 1.14.0 时,使用上述模块源码编译时会报错误,需要对源码做一些修改,参考:https://github.com/gnosek/nginx-upstream-fair/pull/27/commits/ff979a48a0ccb9217437021b5eb9378448c2bd9e # nginx 配置 upstream tomcats { fair; server 192.168.31.100; server 192.168.31.101; server 192.168.31.102; }
consistent_hash
- 一致性哈希算法, 需要 ngx_http_upstream_consistent_hash 模块支持
- consistent_hash $remote_addr:可以根据客户端 ip 映射
- consistent_hash $request_uri: 根据客户端请求的 uri 映射
- consistent_hash $args: 根据客户端携带的参数进行映射
# 部署 wget https://github.com/replay/ngx_http_consistent_hash/archive/master.zip unzip master.zip ./configure --add-module=/root/src/ngx_http_consistent_hash-master make && make install # nginx config upstream tomcats { consistent_hash $request_uri; server 192.168.31.100; server 192.168.31.101; server 192.168.31.102; }