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;
}
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에 영향을 주는 것으로 판단하고 해당 모듈을 사용하지 않도록 하니..
더이상 에러는 발생되지 않았다..
'nginx' 카테고리의 다른 글
proxy_pass 사용할 때 유의사항 - Host (0) | 2017.02.02 |
---|---|
HTTP 1.1 스펙에 따르면 반드시 Host 헤더를 추가해야 한다. (0) | 2017.02.01 |
[nginx] no resolver defined to resolve (0) | 2017.02.01 |
[openresty] health check url 만들기 (0) | 2017.01.24 |
[openresty] lua 처음 다루기 (0) | 2017.01.24 |