Nginx作为一款最流行WEB服务器软件,同时也是一款反向代理和负载均衡软件。毫不夸张地说,Nginx在负载均衡领域绝对是老大地位,这得益于它的高并发和稳定性。而且在配置使用上也是非常简单,维护也特别容易。那么本篇文章就来聊聊Nginx作为负载均衡器,它支持的算法都有哪些?
Nginx支持的算法汇总Nginx并不像LVS那样支持多达10种负载均衡算法,它默认支持4种算法,另外还可以通过自定义三方模块来支持更多的三方算法,下面我只列出来两种常见的。
算法 | 说明 |
轮询 | 默认的算法,如果配置中不指定就走这个算法 |
Weight | 带权重的轮询算法,权重越高被请求的次数就越多 |
ip_hash | 根据客户端IP来选择后端服务器 |
least_conn | 会将请求优先发送给连接数最少的后端服务器 |
fair | 三方模块,按后端服务器响应时间来决策 |
url_hash | 三方模块,按访问url的hash结果来分配请求 |
按请求发来的顺序逐一分配到不同的后端服务器上,最简单最弱智的负载均衡算法,看似公平,其实并不好,比如后端某台服务器负载很高了,那么还是会雷打不动地被动接收请求。
配置示例如下:
upstream aminglinux { server 192.168.10.11; server 192.168.10.12;}Weight
相比较默认的轮询算法,这个Weight多加了一层权重的概念。就是说,我们可以人为地给后端服务器定义权重。这样确实可以保证让性能更好的服务器接收更多的请求,正所谓“能者多劳”!配置示例如下:
upstream aminglinux { server 192.168.10.11 weight=1; server 192.168.10.12 weight=3;}说明:这个weight定义的值范围为1-255,值越大,那么给到的请求就越多。Ip_hash
当使用了负载均衡后,那么就意味着,同一个客户端很有可能第一次访问的是A机器,而第二次访问的是B机器,那么这样就会导致,访问A机器时登录了,而访问B机器时是非登录状态。而这个算法主要用来解决此类问题。该算法下,每个请求按访问IP的哈希结果分配后端服务器,使来自同一个IP的访客固定访问一台后端服务器,这样就解决了上面提到的问题,也就是说所谓的“session共享问题”。
配置示例如下:
upstream aminglinux { ip_hash; server 192.168.10.11; server 192.168.10.12;}Least_conn
从字面意思上也可以理解,就是将请求优先分配给后端服务器里连接数最少的服务器。不过,这个算法是和weight配合使用的,它有一个公式:conns/weight,也就是说Nginx会计算连接数除以权重,最终拿这个值进行比对,值越小会优先分配到请求。配置示例如下:
upstream aminglinux { least_con server 192.168.10.11 weight=10; server 192.168.10.12 weight=5;}Fair
这是一个三方的算法,需要在编译Nginx时增加nginx-upstream-fair-master模块支持。该算法可以根据后端服务器的响应时间的大小来决定将请求发送给谁,响应时间越快,那么就优先拿到请求。配置示例如下:
upstream aminglinux { fair; server 192.168.10.11; server 192.168.10.12;}Url_hash
三方的算法,需要在编译Nginx时增加ngx_http_upstream_hash_module模块支持。该算法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。注意:使用该算法后不能带weight。配置示例如下:
upstream aminglinux { hash $request_uri; server 192.168.10.11; server 192.168.10.12;}