[네트워크] AWS ALB의 HTTP 502 오류를 해결해보자

Hocaron·2023년 10월 23일
2

네트워크

목록 보기
2/6
post-thumbnail
post-custom-banner

로드 밸런서는 클라이언트와 서버 중간에 위치하며 클라이언트 요청을 풀에서 처리할 수 있는 사용 가능한 서버로 라우팅한다. 한 서버가 다운되면 트래픽은 풀에 있는 다른 서버 중 하나로 자동 라우팅해주거나, 새 서버가 추가되면 트래픽을 자동으로 해당 서버로 라우팅해준다.

AWS ALB 를 사용하고 있는 서비스에서 간헐적으로 HTTP 502 잘못된 게이트웨이 오류가 발생하고 있는데, 언제 해당 에러가 나는지와 해결 방법을 알아보자.

발생할 수 있는 다양한 HTTP 상태 코드

HTTP 상태 코드설명
200 OK모든 것이 괜찮습니다.
301 Moved Permanently찾고 있는 것이 없습니다. 대신 여기에서 시도해 보세요.
403 Forbidden당신이 무엇을 찾고 있는지 이해합니다. 하지만 여기서는 당신이 허용되지 않습니다.
404 Not Found당신이 찾고 있는 것을 찾을 수 없습니다.
503 Service Unavailable요청을 처리할 수 없습니다.
502 Bad Gateway서버가 게이트웨이 또는 프록시 역할을 하는 동안 요청을 이행하려고 시도하는 동안 액세스한 인바운드 서버로부터 잘못된 응답을 받았음을 나타냅니다.

4xx 에러는 클라이언트 에러이고, 5xx 에러는 서버쪽의 에러이다. 502 Bad Gateway 에 대해서 알아볼 것이다.

ALB 소켓과 서버 사이에서 502 발생 과정

출처: tessian

  1. ALB(ALB: Application Load Balancer)는 서버에 요청을 보내는 동시에 서버가 연결을 닫기 위해 ALB 소켓으로 FIN 세그먼트를 보낸다.
  2. ALB 소켓은 FIN 세그먼트를 받고 응답하여 새 핸드셰이크 절차를 시작한다.
  3. 이와 동시에 서버 측 소켓은 방금 이전에 닫힌 연결을 참조하는 데이터 요청을 받는다.
  4. 서버는 이 요청을 처리할 수 없기 때문에 RST 세그먼트를 ALB에 보낸다.
  5. ALB는 이후 사용자에게 502 오류를 반환한다.

👉 FIN, RST Flag 가 궁금하다면 여기로

ALB 소켓과 서버 사이에서 502 발생 해결 방법

ALB가 FIN 세그먼트를 서비스에 보내기 전에 서비스가 FIN 세그먼트를 보내지 않도록 설정

즉, 애플리케이션의 유휴 제한 시간을 로드 밸런서에 구성된 유휴 제한 시간보다 크게 설정하여 서비스에서 먼저 HTTP 연결 유지 연결을 닫지 않도록 설정하자.

백엔드 연결의 경우 EC2 인스턴스에 대해 HTTP 연결 유지 옵션을 활성화하는 것이 좋습니다. HTTP 연결 유지는 EC2 인스턴스의 웹 서버 설정에서 활성화할 수 있습니다. HTTP 연결 유지를 활성화하면 연결 유지 초과 시간이 만료될 때까지 로드 밸런서가 백엔드 연결을 다시 사용할 수 있습니다. 또한 애플리케이션의 유휴 제한 시간을 로드 밸런서에 구성된 유휴 제한 시간보다 크게 설정하는 것이 좋습니다. 그렇게 하지 않으면 애플리케이션이 로드 밸런서에 대한 TCP 연결을 비정상적으로 닫을 경우, 로드 밸런서가 연결이 닫혔음을 가리키는 패킷을 받기 전에 애플리케이션에 요청을 전송할 수 있습니다. 이 경우 로드 밸런서는 HTTP 502 잘못된 게이트웨이 오류를 클라이언트에게 전송합니다.
출처: AWS ALB 연결 유휴 제한 시간

WAS 에 설정값 수정

  1. AWS ALB 연결 유휴 제한 시간을 AWS 내에서 확인
    EC2 > 로드 밸런싱 > 로드 밸런서 클릭 > 속성 > 유효 제한 시간 확인(기본은 60초)

  2. 애플리케이션의 유휴 제한 시간 설정

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

🖐 몰랐던 개념 정리

TCP Flag 종류에 대해 알아보자

  • SYN(Synchronization:동기화): 연결 요청 플래그, TCP 세션 성립을 위한 초기 패킷, 시퀀스 번호 설정에 사용

  • ACK(Acknowledgement): 패킷 수신 확인을 나타내며 상대방으로부터 패킷을 받았음을 알림, 성공 또는 실패를 판단하여 재전송 또는 다음 패킷 전송에 사용

  • RST(Reset): 비 정상적인 세션 연결을 끊는데 사용되며, 현재 접속 중인 연결을 즉시 종료시키는 목적으로 사용

  • PSH(Push): 상호작용이 중요한 프로토콜에서 사용되며, 데이터를 즉시 목적지의 응용프로그램 계층으로 전송

  • URG(Urgent): 긴급 데이터 플래그로서 Urgent pointer로 긴급 데이터를 나타내며, 우선순위가 높아야 하는 긴급한 데이터 전송에 사용

  • FIN(Finish): 세션 연결 종료 요청을 나타내며, 더 이상 데이터를 전송하지 않음을 표시

Timeout 종류에 대해 알아보자

  • Connection Timeout: 종단 간 연결을 설정하는데 소요되는 최대 시간을 의미하며, 시간 초과 시 연결 실패로 간주되고 에러가 발생 (종단 간 연결은 TCP 3-way handshake를 통해 생성)

  • Read Timeout: 클라이언트가 서버와의 연결을 설정한 후, 서버에서 응답이 늦게 도착할 경우 발생하는 상태에서 발생

정리

  • 애플리케이션의 유휴 제한 시간을 로드 밸런서에 구성된 유휴 제한 시간보다 크게 설정하자.

References

profile
기록을 통한 성장을
post-custom-banner

2개의 댓글

comment-user-thumbnail
2024년 1월 2일

덕분에 해결했습니다 감사합니다 ㅎㅎ

1개의 답글