详解Nginx no live upstreams while connecting to upstream

网上看到几个相关的文章,觉得很不错,这里整理记录分享一下,供大家参考。

upstream配置分

在分析问题原因之前,我们先来看下关于上面upstream配置一些相关的参数配置说明,参考下面表格

ngx_http_proxy_module在这里插入图片描述

这里重点看框出来的三个参数:proxy_connect_timeout、proxy_send_timeout、proxy_read_timeout,默认超时时间是60s
在这里插入图片描述
官方地址:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout

upstream_server在这里插入图片描述

参考问题:排查Nginx-no live upstreams错误_nginx_lucky猿-GitCode 开源社区

还是重点关注我们目前使用的max_failsfail_timeout,可以看到我们使用的是15s内失败2次即认为该服务不可用。再结合proxy_connect_timeout的默认60s,以上no live upstreams while connecting to upstream问题就很明朗了。

1、Nginx代码:

502伴随出现错误no live upstreams while connecting to upstream的原因:

具体场景:接入层的负载均衡的nginx集群转发给业务nginx,业务nginx再转发给后端的应用服务器。业务nginx配置文件如下:

upstream ads {

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

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

}

  • 如果业务nginx出现日志: no live upstreams while connecting to upstream 的日志,
  • 此外还有大量的“upstream prematurely closed connection while reading response header from upstream”的日志。

看“no live upstreams”的问题。
看字面意思是nginx发现没有存活的backend后端了,但是奇怪的是,只有部分接口访问异常出现502。

可以从nginx源码的角度来看了。

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

在这里可以看出,当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;

}

这里的pc是指向ngx_peer_connection_t结构体的指针, get是个ngx_event_get_peer_pt的函数指针,具体指向哪里,根据配置和使用的轮询规则来确定

接着翻看ngx_http_upstream.c

在ngx_http_upstream_init_main_conf中看到了,如下代码:

uscfp = umcf->upstreams.elts;

for (i = 0; i < umcf->upstreams.nelts; i++) {

init = uscfp[i]->peer.

### 回答1: 这个错误通常是因为Nginx无法连接到上游服务器造成的。可能是因为上游服务器宕机、网络问题或Nginx配置文件中上游服务器的地址配置有误。要解决这个问题,可以检查Nginx配置文件中上游服务器的地址配置是否正确,确保上游服务器处于运行状态并且网络连接正常。 ### 回答2: "No live upstreams while connecting to upstream" 是一个 Nginx 的错误提示,通常在反向代理时出现。它的意思是,Nginx 在向上游服务器(upstream)连接时发现没有可用的上游服务器。 造成这个错误的原因可能有多种,包括: 1. 服务器相关的问题:可能是上游服务器出现了故障或者宕机,或者上游服务器的端口被占用了等原因,导致 Nginx 无法连接上游服务器。 2. Nginx 配置的问题:可能是 Nginx 配置中的上游服务器列表出现了问题,比如上游服务器的 IP 或端口配置错误,或者上游服务器的权重配置不合理等。 解决这个问题的方法也比较简单: 1. 检查上游服务器的状态,确认上游服务器是否正常工作。 2. 检查 Nginx 配置中的上游服务器列表,确认上游服务器的 IP、端口和权重等配置是否正确。 如果发现上游服务器出现故障,可以选择更换上游服务器,或者考虑增加备份服务器来提高稳定性。如果发现 Nginx 配置的问题,可以手动修改配置文件然后重启 Nginx 服务来解决。 ### 回答3: "No live upstreams while connecting to upstream" 是一个 Nginx 错误信息,主要由反向代理配置问题或后端服务不可用引起。 反向代理配置问题通常是由于 Nginx 在尝试向后端服务发出请求时无法正确地连接到它而引起的。当 Nginx 无法连接到任何活动的上游服务器时,就会显示 "No live upstreams while connecting to upstream" 这个错误信息。 可能的解决方法包括: 1. 检查 Nginx 配置文件中的 upstream 服务器设置,确保正确地指定了可用的服务器,并且端口和协议等设置正确。 2. 检查网络连接是否可用。可能存在网络故障或者防火墙等问题导致无法连接到上游服务器。 3. 检查后端服务是否正确运行。检查服务器的日志并确保端口和协议等设置正确。 4. 查看服务器资源使用情况,可能由于资源限制或者服务崩溃导致无法连接到上游服务器。 总结来说,如果在使用 Nginx 进行反向代理时遇到 "No live upstreams while connecting to upstream" 错误,应该首先检查配置文件和网络连接情况,并确保后端服务可用。如果这些方法都无法解决问题,需要更进一步地排查服务器和环境的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值