环境:
centos6/7,nginx-1.9.15.
摘要说明:
上一篇主要讲述nginx下的一些常用语法;
本章节主要讲述nginx的三种负载均衡策略及其相关配置:
步骤:
1.upstream
首先我们看一个负载均衡upstream的配置示例:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
从上面我们可以看到:
- upstream是独立于server的一个配置
- upstream下包含多个server
- upstream可搭配proxy_pass使用
总结,请求到达server,匹配到location,后调用upstream,按照一定规则选择其中一台sever进行反向代理;
接下来我们看下upstream和server的主要语法:
upstream
语法:upstream name { ... }
默认值:none
使用字段:http
说明:upstream主要用于设置一群服务器,可以将upstream放在proxy_pass和fastcgi_pass指令中作为一个单独的实体,upstream可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。
服务器可以指定不同的权重,默认为1。
server
语法:server name [parameters]
默认值:none
使用字段:upstream
说明:指定后端服务器的名称和一些参数,可以使用域名,IP,端口,或者unix socket。如果指定为域名,则首先将其解析为IP。此外还有下需配置参数
- ·weight = NUMBER - 设置服务器权重,默认为1。
- ·max_fails = NUMBER - 在一定时间内(这个时间在fail_timeout参数中设置)检查这个服务器是否可用时产生的最多失败请求数,默认为1,将其设置为0可以关闭检查,这些错误在proxy_next_upstream或fastcgi_next_upstream(404错误不会使max_fails增加)中定义。
- ·fail_timeout = TIME - 在这个时间内产生了max_fails所设置大小的失败尝试连接请求后这个服务器可能不可用,同样它指定了服务器不可用的时间(在下一次尝试连接请求发起之前),默认为10秒,fail_timeout与前端响应时间没有直接关系,不过可以使用proxy_connect_timeout和proxy_read_timeout来控制。
- ·down - 标记服务器处于离线状态,通常和ip_hash一起使用。
- ·backup - (0.6.7或更高)如果所有的非备份服务器都宕机或繁忙,则使用本服务器(无法和ip_hash指令搭配使用)。
示例配置:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
注意:如果你只使用一台上游服务器,nginx将设置一个内置变量为1,即max_fails和fail_timeout参数不会被处理。如果nginx不能连接到上游,请求将丢失。所以upstream一般使用多台上游服务器。
2.upstream默认负载策略——轮询
轮询:按照访问时间先后,按照顺序访问不同的后端服务器
#默认负载策略---轮询,会依次将请求分发到三台server上
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8888;
server 127.0.0.1:9999;
}
server {
listen 2009;
server_name localhost;
location / {
proxy_pass http://backend;
}
error_page 500 502 503 504 /50x.html;
location /50x.html {
root html;
}
}
这里需要注意的是upstream中若有服务挂了,upstream就会将请求进行顺延,并不会丢失请求,直到服务正常;
3.upstream负载策略——权重
权重的本质还是轮询,只是在轮询的同时给每个server加上了轮询几率;
权重配置的越大,轮询几率越大,成正比,默认权重为1;常用于不用配置服务器配置不同权重;
#负载策略---权重,会根据权重将请求按几率分发到后端服务器,权重越高,几率越大,默认权重为1;若后端服务器挂了则不参与负载
upstream backend2010 {
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8888 weight=2;
server 127.0.0.1:9999;
}
server {
listen 2010;
server_name localhost;
location / {
proxy_pass http://backend2010;
}
error_page 500 502 503 504 /50x.html;
location /50x.html {
root html;
}
}
上述配置,若服务都正常,访问6次,会访问8080端口3次,8888端口2次,9999端口1次
注:需要注意的下,同一个nginx下,upstream的名称需要保持唯一
4.upstream负载策略——ip哈希
ip_hash
语法:ip_hash
默认值:none
使用字段:upstream
ip_hash 指令将基于客户端连接的IP地址来分发请求。
哈希的关键字是客户端的C类网络地址,这个功能将保证这个客户端请求总是被转发到一台服务器上,但是如果这台服务器不可用,那么请求将转发到另外的服务器上,这将保证某个客户端有很大概率总是连接到一台服务器。
无法将权重(weight)与ip_hash联合使用来分发连接。如果有某台服务器不可用,你必须标记其为“down”;
#负载策略-ip_hash;根据客户端ip固定客户端请求的后端服务器
upstream backend2011 {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8888;
server 127.0.0.1:9999 down;
}
server {
listen 2011;
server_name localhost;
location / {
proxy_pass http://backend2011;
}
error_page 500 502 503 504 /50x.html;
location /50x.html {
root html;
}
}
ip_hash主要用于解决session问题,后端服务器若不想做session共享可采用此种策略