先描述一下环境,前段的负载均衡转发给nginx,nginx再转发给后端的应用服务器。

nginx配置文件如下:

upstream ads {

        server ap1:8888 max_fails=1 fail_timeout=60s;

        server ap2:8888 max_fails=1 fail_timeout=60s;

}

出现的现象是:

日志里面每隔一两分钟就会记录一条类似 *379803415 no live upstreams while connecting to upstream  的日志,

此外,还有大量的“upstream prematurely closed connection while reading response header from upstream”的日志。


我们先看“no live upstreams”的问题。

看字面意思是nginx发现没有存活的后端了,但是很奇怪的事情是,这段时间一直访问都正常,并且用wireshark看到的也是有进来的,也有返回的。


现在只能从nginx源码的角度来看了。


因为是upstream有关的报错,所以在ngx_http_upstream.c中查找“no live upstreams”的关键字,可以找到如下代码(其实,你会发现,如果在nginx全局代码中找的话,也只有这个文件里面有这个关键字): 


wKiom1XjE1HQ12ybAAQxHYe97qs267.jpg


在这里可以看出,当rc等于NGX_BUSY的时候,就会记录“no live upstreams”的错误。

往上看1328行,可以发现rc的值又是ngx_event_connect_peer这个函数返回的。


ngx_event_connect_peer是在event/ngx_event_connect.c中实现的。这个函数中,只有这个地方会返回NGX_BUSY,其他地方都是NGX_OK或者NGX_ERROR或者NGX_AGAIN之类的。


 rc = pc->get(pc, pc->data);

    if (rc != NGX_OK) {

        return rc;

    }