斜体下划线,表示建议采用默认配置,无需显式的配置
一、ngx_http_upstream_module
此模块中可配置的指令并不是很多。nginx的负载均衡算法包括:
1)round-robin:轮询,request将会依次有序的分发给web server。one by one!默认使用此算法。
2)least-connected:最小连接数,请求将会被分发给当前链接数最小的server。配置名“least_conn”。
3)ip-hash:根据请求的客户端IP作为hashing key,来判定选择哪个server。配置名“ip_hash”。
请求只会在“有效”的server间转发。
upstream backend {
least_conn;
server 192.168.1.110:8080 weight=5;
server 192.168.1.120:8080 max_fails=3 fail_timeout=12s;
server 192.168.1.130 backup;
}
server {
location / {
proxy_pass http://backend;
health_check;
}
}
1、upstream 【name】 {...}
上下文:http
默认情况下,nginx使用“round-robin”算法来选取为请求服务的web server,我们可选的算法有“ip_hash”、“least_conn”。如果web server失效,请求将会被分发给其他server。
2、server 【address】 【参数列表】
上下文:upstream
配置upstream中web server列表,可以使用“域名”,也可以使用“ip:port”方式,如果port没有指定,则默认位“80”;可选参数列表:
1)weight=【number】:设置server的权重,权重越高,其获取request量越大,默认为1。
2)max_fails=【number】:当server访问出错时,nginx重试的最大的失败次数,默认为1。如果仍然没有访问成功,则将此server标记为“failed”,此后的请求将不会在分发给它,直到nginx通过“heath_check”检测到它再次有效为止。
3)fail_timeout=【time】:重试的最长时间,默认位10s;nginx重试时,如果在“fail_timeout”时间内server仍没有链接成功,或者max_fails次数达到上限,那么此server将会标记为“failed”。
4)backup:将server标记为“backup”,即备份。当upstream中所有的主servers都失效时,“backup”才会接收请求。
5)down:将此server永久性的标记为“下线”,通常在运维时操作。如果希望某个机器下线(比如机器确实物理失效,或者在平滑上线过程中,需要将upstream server不再提供服务),我们需要将这些机器标注为“down”,此时那些server上正在执行的请求将会转发给其他server,请求不会中断。有时候,很多人将upstream中的server使用“#”注释,也能起到“server下线”的能力,但是这种方式往往会有一些隐患,比如那些正在执行的请求,将不会中断,而是继续执行,如果此时upstream server重启(上线时)可能会导致这些请求被挂起,简而言之,就是用户感觉访问“变慢了”。
3、health_check 【parameters】
上下文:location
这是一个很重要的选项,nginx周期性检测upstream中server列表的健康状况。
1)interval=【time】:默认值为5s,检测周期。
2)fails=【number】:连续失败多少次以后,此server被标记为“不可用”,默认为1。
3)passes=【number】:如果一个server被认为是“健康”之后,需要检测和确认的次数,默认为1。
4)uri=【uri】:检测server健康时所请求的URL,默认为“/”,通常我们会在web应用中单独做一个空页面或者说是健康探测页面。
5)match=【name】:需要声明一个match区块,根据match区块中的配置匹配“uri”响应的结果,匹配时认为server正常。默认响应的status为“2xx”、“3xx”。
server {
location / {
proxy_pass http://backend;
health_check match=welcome;
}
}
match welcome {
status 200;
header Content-Type = text/html;
body ~ "Welcome to nginx!";
}
4、match 【name】 {...}
上下文:http
用于校验health_check请求的响应结果是否符合。match的规则比较简单,如下是允许的匹配方式:
1)status 200:响应代码为200。
2)status ! 500:响应代码不为500。
3)status 200 204:响应代码为“200”或者“204”。
4)status ! 301 302:响应代码不是301或者“302”。
5)status 200-399:响应代码为200~399区间。
以及上述各种表达的组合,比如“status ! 400-599”、“status 301-303 307”。
6)header Content-Type = text/html;:检测响应header。