当前位置:文档之家› nginx负载均衡宕机配置

nginx负载均衡宕机配置

1.摘要(1)结论详细描述了nginx记录失效节点的6种状态(time out、connect refuse、500、502、503、504,后四项5XX需要配置proxy_next_upstream中的状态才可以生效)、失效节点的触发条件和节点的恢复条件、所有节点失效后nginx会进行恢复并进行重新监听。

(2)Nginx 负载均衡方式介绍Nginx的负载均衡方式一共有4种:rr(轮询模式)、ip_hash、fair、url_hash。

(3)Ngxin负载均衡和相关反向代理配置内容Nginx负载均衡和与容错相关的反向代理的配置。

(4)获取后端流程后端server的自动容错流程图。

(5)测试环境和测试结果针对几种错误方式进行自动容错测试。

2.结论(1)nginx 判断节点失效状态Nginx 默认判断失败节点状态以connect refuse和time out状态为准,不以HTTP错误状态进行判断失败,因为HTTP只要能返回状态说明该节点还可以正常连接,所以nginx判断其还是存活状态;除非添加了proxy_next_upstream指令设置对404、502、503、504、500和time out等错误进行转到备机处理,在next_upstream过程中,会对fails进行累加,如果备用机处理还是错误则直接返回错误信息(但404不进行记录到错误数,如果不配置错误状态也不对其进行错误状态记录),综述,nginx记录错误数量只记录timeout 、connect refuse、502、500、503、504这6种状态,timeout和connect refuse是永远被记录错误状态,而502、500、503、504只有在配置proxy_next_upstream后nginx才会记录这4种HTTP错误到fails中,当fails大于等于max_fails时,则该节点失效;(2)nginx 处理节点失效和恢复的触发条件nginx可以通过设置max_fails(最大尝试失败次数)和fail_timeout(失效时间,在到达最大尝试失败次数后,在fail_timeout的时间范围内节点被置为失效,除非所有节点都失效,否则该时间内,节点不进行恢复)对节点失败的尝试次数和失效时间进行设置,当超过最大尝试次数或失效时间未超过配置失效时间,则nginx会对节点状会置为失效状态,nginx不对该后端进行连接,直到超过失效时间或者所有节点都失效后,该节点重新置为有效,重新探测;(3)所有节点失效后nginx将重新恢复所有节点进行探测如果探测所有节点均失效,备机也为失效时,那么nginx会对所有节点恢复为有效,重新尝试探测有效节点,如果探测到有效节点则返回正确节点内容,如果还是全部错误,那么继续探测下去,当没有正确信息时,节点失效时默认返回状态为502,但是下次访问节点时会继续探测正确节点,直到找到正确的为止。

3.nginx负载均衡Nginx的负载均衡方式一共有4种:rr(轮询模式)、ip_hash、fair、url_hash;Nginx自带的2种负载均衡为rr和ip_hash,fair和url_hash为第三方的插件,nginx在不配置负载均衡的模式下,默认采用rr负载均衡模式。

RR负载均衡模式:每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。

Ip_hash负载均衡模式:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session共享问题可用后端服务的session共享代替nginx的ip_hash。

Fair(第三方)负载均衡模式:按后端服务器的响应时间来分配请求,响应时间短的优先分配。

url_hash(第三方)负载均衡模式:和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到一个同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。

4.Nginx 负载均衡配置Nginx的负载均衡采用的是upstream模块其中默认的采用的负载均衡模式是轮询模式rr(round_robin),具体配置如下:1)指令:ip_hash语法:ip_hash默认值:none使用字段:upstream这个指令将基于客户端连接的IP地址来分发请求。

哈希的关键字是客户端的C类网络地址,这个功能将保证这个客户端请求总是被转发到一台服务器上,但是如果这台服务器不可用,那么请求将转发到另外的服务器上,这将保证某个客户端有很大概率总是连接到一台服务器。

无法将权重(weight)与ip_hash联合使用来分发连接。

如果有某台服务器不可用,你必须标记其为“down”,如下例:upstream backend {ip_hash;server ;server ;server down;server ;}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 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语法:upstream name { … }默认值:none使用字段:http这个字段设置一群服务器,可以将这个字段放在proxy_pass和fastcgi_pass指令中作为一个单独的实体,它们可以可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。

服务器可以指定不同的权重,默认为1。

示例配置upstream backend {server weight=5;server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;server unix:/tmp/backend3;}请求将按照轮询的方式分发到后端服务器,但同时也会考虑权重。

在上面的例子中如果每次发生7个请求,5个请求将被发送到,其他两台将分别得到一个请求,如果有一台服务器不可用,那么请求将被转发到下一台服务器,直到所有的服务器检查都通过。

如果所有的服务器都无法通过检查,那么将返回给客户端最后一台工作的服务器产生的结果。

2)变量版本0.5.18以后,可以通过log_module中的变量来记录日志:log_format timing '$remote_addr - $remote_user [$time_local] $request ''upstream_response_time $upstream_response_time ''msec $msec request_time $request_time';log_format up_head '$remote_addr - $remote_user [$time_local] $request ''upstream_http_content_type $upstream_http_content_type';$upstream_addr前端服务器处理请求的服务器地址$upstream_cache_status0.8.3版本中其值可能为:MISSEXPIRED - expired。

请求被传送到后端。

UPDATING - expired。

由于proxy/fastcgi_cache_use_stale正在更新,将使用旧的应答。

STALE - expired。

由于proxy/fastcgi_cache_use_stale,后端将得到过期的应答。

HIT$upstream_status前端服务器的响应状态。

$upstream_response_time前端服务器的应答时间,精确到毫秒,不同的应答以逗号和冒号分开。

$upstream_http_$HEADER随意的HTTP协议头,如:$upstream_http_host$upstream_http_host3)Proxy指令:proxy_next_upstream语法:proxy_next_upstream[error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|o ff]默认值:proxy_next_upstream error timeout使用字段:http, server, location确定在何种情况下请求将转发到下一个服务器:error - 在连接到一个服务器,发送一个请求,或者读取应答时发生错误。

相关主题