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 '김용환'
,