Nginx 反向代理 负载均衡

常见负载均衡算法

 
  • 轮询(默认)
  • 权重
    • weight,访问比率等于权重之比
  • IP 哈希
    • 解决session问题:每一个请求访问IP的hash结果分配,这样每一个访客能够固定到后端某一个台服务器。
    • 问题:
      • 如某台服务器挂掉,对应ip_hash找不到该机器?
        • 若是哈希选择失败次数达到20次以上,回退到轮询策略进行选择。
      • 若是同一IP地址请求较多,形成某一服务器压力较大,而其他的服务器较空闲?。
        • 能够使用url_hash 进一步细分,来实现负载均衡。
  • 最少链接(least_conn)
    • 选择链接数最少的服务器
  • url_hash(第三方)
    • 按访问URL的hash结果来分配请求,使每一个URL定向到同一个后端服务器。后端服务器为缓存时比较适用。
    • 此中策略中,不能使用weight,等其余参数。
  • fair(第三方)
    • 按后端服务器的响应时间来分配请求,响应时间短的优先分配
 
 
配置模块--upstream模块

upstream模块可定义一个新的上下文, 它包含了一组upstream服务器,这些服务器可能被赋予了不一样的权重、不一样的类型甚至能够基于维护等缘由被标记为down。
upstream模块常用在 proxy模块中;
 
经常使用指令
  • ip_hash
    • 基于客户端IP地址完成请求的分发
    • 它能够保证来自于同一个客户端的请求始终被转发至同一个upstream服务器;
  • keepalive
    • 每一个worker进程为发送到upstream服务器的链接所缓存的个数;
  • least_conn
    • 最少链接调度算法;
  • server:定义一个upstream服务器的地址,还可包括一系列可选参数,如:
    • weight
      • 权重
    • max_fails
      • 最大失败链接次数,失败链接的超时时长由fail_timeout指定;
    • fail_timeout
      • 等待请求的目标服务器发送响应的时长;
    • backup
      • 用于fallback的目的,全部服务均故障时才启动此服务器;
    • down
      • 手动标记其再也不处理任何请求;
 
应用场景

官方给的简单例子:
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;
    }
}

 

动态选择的例子
resolver 10.0.0.1;

upstream dynamic {
    zone upstream_dynamic 64k;

    server backend1.example.com      weight=5;
    server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
    server 192.0.2.1                 max_fails=3;
    server backend3.example.com      resolve;
    server backend4.example.com      service=http resolve;

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

server {
    location / {
        proxy_pass http://dynamic;
        health_check;
    }
}

 



 
实践与问题

实现默认轮询与权重
     // 权重
      upstream backend {
              server 10.103.100.3:8090 weight=2;
              server 10.103.100.4:8090;
     }
     // 默认轮询
      upstream backend {
              server 10.103.100.3:8090;
              server 10.103.100.4:8090;
       }
 
      server {
 
          listen 80;
          server_name localhost;
 
          location /{
              proxy_pass http://backend;
          }
     }

 

问题
  • upstream 模块是在http配置块底下,放在server配置块里面会报错
  • upstream server 定义后台服务器时直接指定主机名和端口便可
    • 不须要加上http://
    • http:// 在proxy_pass 中加上便可
  • weight 默认值为1
 
IP_hash
// 带权重ip_hash
      upstream backend {
               ip_hash;
              server 10.103.100.3:8090 weight=2;
              server 10.103.100.4:8090;
     }
     // 普通ip_hash
      upstream backend {
              ip_hash;
              server 10.103.100.3:8090;
              server 10.103.100.4:8090;
       }
 
      server {
 
          listen 80;
          server_name localhost;
 
          location /{
              proxy_pass http://backend;
          }
     }
注意:
  • weight,ip_hash 能够叠加使用
相关文章
相关标签/搜索