nginx에 upstream을 사용하고 있는데, 에서 어느 시간부터 다음과 같은 에러가 선형적으로 늘어가기 시작했고 엄청난 양의 에러가 발생하기 시작했다.


no live upstreams while connecting to upstream, client: ip_address , server: example.com, request: "GET / HTTP/1.1", upstream: "http://example.com", host: "example.com", referrer: "http://example.com/mypages/"


upstream prematurely closed connection while reading response header from upstream, client: ip_address , server: example.com, request: "GET / HTTP/1.1", upstream: "http://example.com", host: "example.com", referrer: "http://example.com/mypages/"




문제 해결 방법을 차례로 테스트했다.


1. timeout (proxy_timeout 등등)

2. upstream keepalive 

3. backend resource thread pool


그러나 여전히 문제를 해결할 수 없었다.


2개의 backend를 보면 upstream을 보던 설정을 1개의 backend로 보게 하고 tcpdump를 뜨면서 에러가 날 때 어떠한 현상이 있는지 확인했다.


no live upstreams while connecting to   upstream, upstream prematurely closed connection while reading response header from upstream 에러 발생과  tcpdump 덤프와의 인과 관계가 없음을 확인했다.


이 문제는 nginx 내부의 문제로 생긴 것으로 생각하고 소스를 확인해봤다.



https://github.com/nginx/nginx/blob/master/src/stream/ngx_stream_proxy_module.c#L696


    if (rc == NGX_BUSY) {

        ngx_log_error(NGX_LOG_ERR, c->log, 0, "no live upstreams");

        ngx_stream_proxy_finalize(s, NGX_STREAM_BAD_GATEWAY);

        return;

    }



https://github.com/nginx/nginx/blob/beaaeb9f9e642d1d153ee65569d99499eef624e9/src/http/ngx_http_upstream.c#L3551



                if (upstream->read->eof) {

                    ngx_log_error(NGX_LOG_ERR, upstream->log, 0,

                                  "upstream prematurely closed connection");


                    ngx_http_upstream_finalize_request(r, u,

                                                       NGX_HTTP_BAD_GATEWAY);

                    return;

                }



connection 이슈인 것을 확인했다..


nginx 설정을 보니 아... 내가 못 보던 nginx 사용자 정의 모듈이 있었고 해당 모듈이 특정 서버를 바라보고 있었다.


해당 모듈의 통신이 upstream에 영향을 주는 것으로 판단하고 해당 모듈을 사용하지 않도록 하니..


더이상 에러는 발생되지 않았다..





Posted by '김용환'

댓글을 달아 주세요

  1. Favicon of https://byeong-gook.tistory.com BlogIcon recovery-Balance 2022.04.27 10:44 신고  댓글주소  수정/삭제  댓글쓰기

    운용중인 서버라면 .. 어떤 방식으로 테스트 할수있을까요?

    리눅스버전은 Centos7 이고 Nginx, Tomcat의 미들웨어형식의 서버인데요

    특정시간대에 $request_time이 증가하며 no lives upstream error가 발생하는데
    tomcat catalina 로그 상으로는 tomcat이 죽은 흔적이없고 nginx access log에서만
    톰캣이 request를 처리해주지못해 502를 뱉는거같은데요

    데이터 유입량이 갑자기 해당 시간대에 증가해서 발생하는 오류는 아닌거같은데