kyucumber
전체 글 보기

Nginx의 keepalive 옵션과 502 Bad Gateway

서비스 운영 중 간헐적으로 502 Bad Gateway가 발생하는 이슈를 겪었습니다.

특정 시간, 트래픽이 몰리는 상황에 발생하는것이 아니라 간헐적으로 발생했기 때문에 어딘가 설정이 잘못된 부분이 있을거라고 추측했었습니다. 결론적으로 Nginx에 적용해둔 keepalive 시간과 로드밸런서의 idle timeout이 맞지 않아 간헐적으로 커넥션이 끊어지면서 발생하는 문제였습니다.

로드밸런서의 idle timeout

로드밸런서는 설정된 idle timeout이 경과할 때까지 데이터를 보내거나 받지 않은 경우 커넥션을 끊게 됩니다.

Nginx의 keepalive timeout

Nginx는 keepalive timeout이 경과할 때까지 세션을 ESTABLISH 상태로 유지합니다.

문제가 발생한 어플리케이션은 아래와 같이 idle timeout 60초, Nginx keepalive timeout 30초로 설정되어 있었습니다.

idle timeout: 60s keepalive timeout: 30s;

60초가 지나기 전 keepalive timeout(30s)에 의해 연결을 끊어버리면서 502 Bad Gateway가 발생한 것으로 보입니다.

이런 문제를 방지하려면 항상 로드밸런서의 idle timeout보다 Nginx의 keepalive timeout을 길게 설정해야 합니다.

idle timeout: 60s keepalive timeout: 75s;

Reference

Table of contents