nginx 负载均衡


负载均衡

upstream backend {
    ip_hash;
    server 127.0.0.1:8088 weight=1;
    server 127.0.0.1:8080 weight=1;
    #server 127.0.0.1:9080 backup;
}

server{
    listen 80;
    server_name  localhost;
    location / {
    proxy_set_header Host   $host;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 反向代理
    proxy_pass http://backend/;
    }
}

upstream 相关参数:

service 反向服务地址 加端口
weight  权重
max_fails   失败多少次 认为主机已挂掉则,踢出
fail_timeout    踢出后重新探测时间
backup  备用服务
max_conns   允许最大连接数
slow_start  当节点恢复,不立即加入,而是等待 slow_start 后加入服务对列

负载均衡算法:

list 找一个
轮询 + 权重
随机  + 权重
ip_hash 
url_hash
一致性hash
最小活跃数
最短响应时间
  1. 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
        server 192.168.0.14;
        server 192.168.0.15;
}
  1. 指定权重 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
        server 192.168.0.14 weight=8;
        server 192.168.0.15 weight=10;
}
  1. IP绑定 ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
        ip_hash;
        server 192.168.0.14:8888;
        server 192.168.0.15:8080;
}
  1. least_conn 把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
upstream backserver {
        least_conn;    #把请求转发给连接数较少的后端服务器
        server localhost:8080   weight=2;
        server localhost:8081;
        server localhost:8082 backup;
        server localhost:8083   max_fails=3 fail_timeout=20s;
}
  1. fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
        server server1;
        server server2;
        fair;
}
  1. url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
        server squid1:3128;
        server squid2:3128;
        hash $request_uri;
        hash_method crc32;
}