centos6/7,nginx-1.9.15.
上一篇主要讲述nginx下的一些常用语法;
本章节主要讲述nginx的三种负载均衡策略及其相关配置:
首先我们看一个负载均衡upstream的配置示例:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
从上面我们可以看到:
总结,请求到达server,匹配到location,后调用upstream,按照一定规则选择其中一台sever进行反向代理;
接下来我们看下upstream和server的主要语法:
语法:upstream name { ... }
默认值:none
使用字段:http
说明:upstream主要用于设置一群服务器,可以将upstream放在proxy_pass和fastcgi_pass指令中作为一个单独的实体,upstream可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。
服务器可以指定不同的权重,默认为1。
语法:server name [parameters]
默认值:none
使用字段:upstream
说明:指定后端服务器的名称和一些参数,可以使用域名,IP,端口,或者unix socket。如果指定为域名,则首先将其解析为IP。此外还有下需配置参数
示例配置:
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一般使用多台上游服务器。
轮询:按照访问时间先后,按照顺序访问不同的后端服务器
#默认负载策略---轮询,会依次将请求分发到三台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就会将请求进行顺延,并不会丢失请求,直到服务正常;
权重的本质还是轮询,只是在轮询的同时给每个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的名称需要保持唯一
语法: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共享可采用此种策略