负载均衡(Load Balance):其含义就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提供网络的可用性和灵活性。
upstream demo_server {
server 192.168.184.20:8080;
server 192.168.184.20:8081;
server 192.168.184.20:8082;
}
server {
listen 80;
server_name balance.kutian.edu;
location /balance/ {
proxy_pass http://demo_server;
}
}
一、常用策略 - 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
upstream demo_server_1 {
server 192.168.184.20:10020;
server 192.168.184.20:10010;
}
二、常用策略 - 哈希算法
哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值我们称之为哈希值,散落明文到哈希值的映射是不可逆的
语法:hash key [ consistent ]
默认值:无
上下文:upstream
upstream demo_server_1 {
hash $request_uri;
server 192.168.184.20:10020;
server 192.168.184.20:10010;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://demo_server_1;
}
}
同一个uri只会分配到同一个服务器,可以防止在每个服务器都产生缓存,增加服务器负担
三、常用策略 - ip_hash算法
语法:ip_hash;
默认值:无
上下文:upstream
含义:指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题
upstream demo_server_1 {
ip_hash;
server 192.168.184.20:10020;
server 192.168.184.20:10010;
}
三、负载均衡算法 - 最少连接数算法
从上游服务器,挑选一台已建立连接数最少的分配请求
least_conn
指令
模块ngx_http_upstream_least_conn_module,禁用通过–without-http_upstream_least_conn_module
- 1.least_conn;
默认值:无
上下文:upstream - 2.zone name [ size ];
默认值:无
示例:zone test 10M;
上下文:upstream
含义:记录后端服务器连接情况,判断哪些服务器连接数最少,一般1M可以处理5000-6000个连接
四:其他参数
参数 | 含义 |
---|---|
down | 表示当前的server暂时不参与负载 |
weight | 默认为1,值越大,负载的权重越大 |
max_fails | 默认为1,允许请求失败的次数,当超过时,返回http_next_upstream 模块定义的错误 |
fail_timeout | max_fails一次失败后,暂停的时间 |
backup | 备用,其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻 |
五、负载均衡场景下Nginx针对上游服务器返回异常时的容错机制
- 1.proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | noidempotent | off;
默认值:error timeout
;
上下文:http, server, location
非幂等请求表示会对服务器内容产生影响的请求,比如post,delete…
含义:当上游服务器返回何种错误值时转发到下一个服务器
- 2.proxy_next_upstream_timeout times;
默认值:0;
上下文:http, server, location
含义:当某个上游服务器返回错误时,将请求转发到下一个服务器的时间 - 3.proxy_next_upstream_tries number;
默认值:0;
上下文:http, server, location
含义:错误发生时,最多会转发几次请求,这里的0不是说一次也不转发,而是表示不限制转发 - 4.proxy_read_timeout time;
默认值:60s;
上下文:http, server, location
含义:设置读取响应的时间,指定时间内没有接收完响应会返回timeout错误 - 5.proxy_intercept_errors on | off;
默认值:on;
上下文:http, server, location
含义:上游返回响应码大于300时,是直接将上游响应码返回客户端还是按照error_page处理,如果按error_page处理,要定义error_page页面