Nginx错误日志:no live upstreams while connecting to upstream xxx;
问题和现象:
近期有业务方反馈业务接口请求偶尔会返回502现象;
查看access.log日志中502请求个数:
全部接口统计过去一天502请求个数:7692,请求总数:376,178,782,502概率:0.002%;
查看nginx中的错误日志:nginx_log/error.log 搜关键词“no live upstreams”
发现类似报错:no live upstreams while connecting to upstream, client: xxxx, server:
问题分析:
根据超时接口名abc_service,找到对应的location,或者直接在nginx.conf中搜索关键词“proxy_read_timeout 800ms”;
通过该location下面的proxy_pass 找到对应的upstream;查看该upstream下面的server节点数和失败配置,默认配置为:max_fails=1 fail_timeout=10s
由于abc_service接口本身大于800ms超时请求较多,达到默认失败1次后,该server节点10s内不接受请求;当唯二的两个server都失败时,nginx进行quick recovery,把每个节点的失败次数都重置为0,然后再返回一个NGX_BUSY,然后nginx就会打印一条no live upstreams ,最后又回到原始状态,接着进行转发了;
这2个server节点由于abc_service单独的超时时间配置触发了server节点失败阈值,导致该server节点下线,当两个节点都下线时,触发一次no live upstream,同时返回给客户端502;
问题解决:
优化nginx节点超时接口对应的upstream下的server节点参数,server xx:8888 max_fails=10 fail_timeout=1s;
参数解释:该节点触发10次失败时,暂停服务1s;由于abc_service接口本身800ms超时算一次失败,所以避免了由个别接口超时导致的server节点下线;只有当这两个server节点本身不可用时,才会触发502;
原文