로드 밸런서는 클라이언트와 서버 중간에 위치하며 클라이언트 요청을 풀에서 처리할 수 있는 사용 가능한 서버로 라우팅한다. 한 서버가 다운되면 트래픽은 풀에 있는 다른 서버 중 하나로 자동 라우팅해주거나, 새 서버가 추가되면 트래픽을 자동으로 해당 서버로 라우팅해준다.
AWS ALB 를 사용하고 있는 서비스에서 간헐적으로 HTTP 502 잘못된 게이트웨이
오류가 발생하고 있는데, 언제 해당 에러가 나는지와 해결 방법을 알아보자.
HTTP 상태 코드 | 설명 |
---|---|
200 OK | 모든 것이 괜찮습니다. |
301 Moved Permanently | 찾고 있는 것이 없습니다. 대신 여기에서 시도해 보세요. |
403 Forbidden | 당신이 무엇을 찾고 있는지 이해합니다. 하지만 여기서는 당신이 허용되지 않습니다. |
404 Not Found | 당신이 찾고 있는 것을 찾을 수 없습니다. |
503 Service Unavailable | 요청을 처리할 수 없습니다. |
502 Bad Gateway | 서버가 게이트웨이 또는 프록시 역할을 하는 동안 요청을 이행하려고 시도하는 동안 액세스한 인바운드 서버로부터 잘못된 응답을 받았음을 나타냅니다. |
4xx 에러는 클라이언트 에러이고, 5xx 에러는 서버쪽의 에러이다. 502 Bad Gateway 에 대해서 알아볼 것이다.
즉, 애플리케이션의 유휴 제한 시간을 로드 밸런서에 구성된 유휴 제한 시간보다 크게 설정하여 서비스에서 먼저 HTTP 연결 유지 연결을 닫지 않도록 설정하자.
백엔드 연결의 경우 EC2 인스턴스에 대해 HTTP 연결 유지 옵션을 활성화하는 것이 좋습니다. HTTP 연결 유지는 EC2 인스턴스의 웹 서버 설정에서 활성화할 수 있습니다. HTTP 연결 유지를 활성화하면 연결 유지 초과 시간이 만료될 때까지 로드 밸런서가 백엔드 연결을 다시 사용할 수 있습니다. 또한 애플리케이션의 유휴 제한 시간을 로드 밸런서에 구성된 유휴 제한 시간보다 크게 설정하는 것이 좋습니다. 그렇게 하지 않으면 애플리케이션이 로드 밸런서에 대한 TCP 연결을 비정상적으로 닫을 경우, 로드 밸런서가 연결이 닫혔음을 가리키는 패킷을 받기 전에 애플리케이션에 요청을 전송할 수 있습니다. 이 경우 로드 밸런서는 HTTP 502 잘못된 게이트웨이 오류를 클라이언트에게 전송합니다.
출처: AWS ALB 연결 유휴 제한 시간
AWS ALB 연결 유휴 제한 시간을 AWS 내에서 확인
EC2 > 로드 밸런싱 > 로드 밸런서 클릭 > 속성 > 유효 제한 시간 확인(기본은 60초)
애플리케이션의 유휴 제한 시간 설정
Spring boot (Embeded Tomcat)
server:
tomcat:
keep-alive-timeout: 190_000 // 190초
Express
const express = require('express');
const app = express();
const server = app.listen(80);
server.keepAliveTimeout = 190_000
SYN(Synchronization:동기화): 연결 요청 플래그, TCP 세션 성립을 위한 초기 패킷, 시퀀스 번호 설정에 사용
ACK(Acknowledgement): 패킷 수신 확인을 나타내며 상대방으로부터 패킷을 받았음을 알림, 성공 또는 실패를 판단하여 재전송 또는 다음 패킷 전송에 사용
RST(Reset): 비 정상적인 세션 연결을 끊는데 사용되며, 현재 접속 중인 연결을 즉시 종료시키는 목적으로 사용
PSH(Push): 상호작용이 중요한 프로토콜에서 사용되며, 데이터를 즉시 목적지의 응용프로그램 계층으로 전송
URG(Urgent): 긴급 데이터 플래그로서 Urgent pointer로 긴급 데이터를 나타내며, 우선순위가 높아야 하는 긴급한 데이터 전송에 사용
FIN(Finish): 세션 연결 종료 요청을 나타내며, 더 이상 데이터를 전송하지 않음을 표시
Connection Timeout: 종단 간 연결을 설정하는데 소요되는 최대 시간을 의미하며, 시간 초과 시 연결 실패로 간주되고 에러가 발생 (종단 간 연결은 TCP 3-way handshake를 통해 생성)
Read Timeout: 클라이언트가 서버와의 연결을 설정한 후, 서버에서 응답이 늦게 도착할 경우 발생하는 상태에서 발생
덕분에 해결했습니다 감사합니다 ㅎㅎ