有时候我们查看Nginx的错误日志,会发现有这么一种错误:

2019/04/13 20:41:03 [error] 18904#0: *214818926 no live upstreams while connecting to upstream, client: 47.111.193.40, server: xxx.xxx.cn, request: “GET /api/xxx HTTP/1.1”, upstream: “http://service/api/xxx", host: “xxx.xxx.cn”

里面的信息都是请求相关的内容,我们抓住关键点:

1
no live upstreams

nginx的upstream,是用于将请求分配到上游(被代理)服务,我们可以指定请求分配的策略,重试机制等等。

假设我们的upstream是这样配置的:

1
2
3
4
5
upstream a-service {
server 172.16.x.1;
server 172.16.x.2;
server 172.16.x.3;
}

服务a-service拥有3个上游服务,这里没做其他配置,那么默认nginx会将请求轮询到3个服务去。

现在由于种种原因,172.16.x.1出现了问题,nginx发现请求失败后,会尝试下一个upstream也就是172.16.x.2,并且把172.16.x.1暂时标记为不可用状态,这样的话可以让调用方的请求正确使用。

然而当172.16.x.2也不可用呢,nginx会尝试172.16.x.3,如果172.16.x.3也不可用,意味着upstream a-service整体是不可用的

no live upstreams便是这个时候报出来的错误。

但你可能可以看到,错误报出来后,服务还是正常可用啊,是因为nginx报出错误后,会将upstream下的几个上游服务失败次数清0,然后重新开始服务,假设这个时候172.16.x.1已经恢复过来了,服务就是可用的。