Nginx反向代理与负载均衡实战篇

2019-10-17 16:52:26丽君

upstream模块介绍

ngx_http_upstream_module模块支持的代理方式有proxy_pass,fastcgi_pass等,主要使用proxy_pass。

upstream模块允许nginx定义一组或多组节点服务器组,使用时通过proxy_pass代理把网站的请求发送到定义好的对应的节点组中。

示例:创建节点服务器池

upstream blog {
 server 192.168.30.5:80 weight=5;
 server 192.168.30.6:81 weight=10;
 server 192.168.30.7:82 weight=15;
}

upstream:创建节点服务器组的关键字,必须有;
blog:节点服务器组的名字,必须有,可自定义名字;
server:关键字,后面可加IP或者域名或者IP:端口,不指定端口默认80;
weight:权重,数值越大被分配的请求越多。默认为1

设置节点服务器的状态值除了weight之外,还有:
max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
fail_timeout:max_fails次失败后,暂停的时间。
down:表示当前的节点服务器不参与负载,标志机器永远不可用,可配合iP_hash使用
backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

使用域名的upstream

upstream blog2{
 server www.syushin.com weight=5;
 server blog.syushin.org down;
 server blog.syushin.cc backup;
}

调度算法

rr轮询(默认调度算法,静态调度算法)

按客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器。

wrr(权重轮询,静态调度算法)

在rr轮询的基础上加上权重,使用该算法的时候,权重和用户访问成正比,权重值越大,被转发的请求就越多。
比如有30个请求,2台服务器A(10.0.0.1)和B(10.0.0.2),如果希望A处理10个请求,B处理20个请求,可以这样定义:

upstream pools{
 server 10.0.0.1 weight=1;
 server 10.0.0.2 weight=2;
}

ip_hash(静态调度算法)

每个请求按客户端IP的hash结果分配,当新的请求到达,先将客户端IP通过哈希算法哈希出一个值,在随后的分配客户端请求中,客户IP的哈希值只要相同,就会被分配到同一台服务器。

upstream blog_pool{
 ip_hash;
 server 192.168.30.5:80;
 server 192.168.30.6:8090;
}

注意:当使用ip_hash时,不能有weight和backup。

least_conn算法

least_conn算法会根据后端服务器的连接数来觉得分配情况,哪台服务器连接数最少就分发多的请求。

调度算法除了上面所列的(常用)还有很多,就不一一列举了。

http_proxy_module模块

http_proxy_module可以将请求转发到另外一台服务器,在反向代理中,会通过location功能匹配指定的URI,然后把收到符合匹配的URI的请求通过proxy_pass抛给定义好的upstream节点池。