Nginx集群和负载均衡

集群

#三台服务器集群
upstream jinsh {
        server 192.168.10.125:8080;
        server 192.168.10.126:8080;
        server 192.168.10.127:8080;
}

#当浏览器每次访问 http://www.jinsh.com 时,将会以轮询的形式访问上面的三台服务器
server {
        listen 80;
        server_name www.jinsh.com;

        location / {
                proxy_pass http://jinsh;
        }

}
  • 负载均衡 轮询与加权
#使用weight来配置权重,weight值越大该台服务器接受请求会越多
#不加weight,默认是按轮询的方式挨个接收请求的
upstream jinsh {
        server 192.168.10.125:8080 weight=5;
        server 192.168.10.126:8080 weight=2;
        server 192.168.10.127:8080 weight=1;
}
  • 负载均衡 ip_hash
    算法:hash(ip) % node_counts = index
    ip_hash 可以保证用户访问可以请求到上游服务中的固定的服务器,前提是用户ip没有发生更改。
    使用ip_hash的注意点:不能把后台服务器直接移除,只能标记down
upstream tomcats {
        ip_hash;

        server 192.168.1.173:8080;
        server 192.168.1.174:8080 down;
        server 192.168.1.175:8080;
}

参考:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash

  • 哈希算法与一致性哈希算法

    • 哈希算法:hash(ip) % node_counts = index
      ip_hash会取IP地址的前三段进行计算,所以同一内网下的计算机将会请求到同一个节点。
      哈希算法的问题:当服务器节点数发生变动时,算计的计算将发生改变。
      Nginx集群和负载均衡_nginx
    • 一致性哈希算法:
      当服务器节点数发生变动时,只会影响到变动节点上的用户请求。
      Nginx集群和负载均衡_服务器_02
  • 负载均衡 url_hash
    算法:hash(url) % node_counts = index
    根据请求的 url 来分配响应节点

upstream tomcats {
        # url hash
    	hash $request_uri;

        server 192.168.1.173:8080;
        server 192.168.1.174:8080 down;
        server 192.168.1.175:8080;
}
  • 负载均衡 least_conn
    根据最少连接数去分配,哪个节点连接数最少就分配给哪个节点
upstream tomcats {
    least_conn;

    server 192.168.1.173:8080;
    server 192.168.1.174:8080;
    server 192.168.1.175:8080;
}

upstream指令参数

  • max_conns:限制每台server的连接数,用于保护避免过载,可起到限流作用。
#如果此时worker进程数配置的是1,那么该集群同一时刻就只能处理6个请求
upstream jinsh {
        server 192.168.10.125:8080 max_conns=2;
        server 192.168.10.126:8080 max_conns=2;
        server 192.168.10.127:8080 max_conns=2;
}
  • slow_start:让服务器缓慢加入到集群中来
upstream tomcats {
        server 192.168.1.173:8080 weight=6 slow_start=60s;
        server 192.168.1.174:8080 weight=2;
        server 192.168.1.175:8080 weight=2;
}
#该参数不能使用在hash和random load balancing中
#如果在upstream中只有一台server,则该参数失效
  • down:标识某台服务器不可用
upstream tomcats {
        server 192.168.1.173:8080 down; #这台服务器将无法访问
        server 192.168.1.174:8080 weight=2;
        server 192.168.1.175:8080 weight=2;
}
  • backup:标识某台服务器为备用机
upstream tomcats {
        server 192.168.1.173:8080 backup; #当下面两台服务器都无法访问时,请求才会访问到这一台备用服务器
        server 192.168.1.174:8080 weight=2;
        server 192.168.1.175:8080 weight=2;
}
#backup参数不能使用在hash和random load balancing中。
  • max_fails和fail_timeout
#max_fails:表示失败几次,则标记server已宕机,剔除上游服务。
#fail_timeout:表示失败的重试时间。
upstream tomcats {
        server 192.168.1.173:8080 max_fails=2 fail_timeout=15s;
        server 192.168.1.174:8080 weight=2;
        server 192.168.1.175:8080 weight=2;
}
#则表示在15秒内请求某一server失败达到2次后,则认为该server已经挂了或者宕机了,随后15秒内不会有新的请求到达刚刚挂掉的节点上,而是会请求到正常运作的server,15秒后会再有新请求尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复

Keepalived 提高吞吐量

  • Keepalived :设置长连接处理的数量
  • proxy_http_version:设置长连接http版本为1.1
  • proxy_set_header:清除connection header 信息
upstream tomcats {
        server 192.168.1.190:8080;
        keepalive 32;
}

server {
        listen       80;
        server_name  www.tomcats.com;

        location / {
            proxy_pass  http://tomcats;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
    }