1. 首页
  2. >
  3. 服务器技术
  4. >
  5. Nginx

Nginx 反向代理及负载均衡实践

概述

  • 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; }