502 Bad Gateway
- 배포 중인 서비스가 504 Gateway Timeout 에러를 일으킨 후 뻗어서 EC2를 재부팅하고 나니 502 Bad Gateway 에러가 발생하였다.
- 구글링을 해보니 502에러는 EC2의 Load Balancer의 문제인 경우라고 한다.
- AWS 공식 문서 트러블 슈핑
에러 발생 원인이 뭘까?
504 에러 원인
- 용량이 큰 이미지를 등록하는 과정(리사이징 동작)에서 서버 트래픽에 과부하가 걸려 504 에러가 먼저 발생하였다. EC2에 접속도 되지 않고 배포된 서비스에서 역시 아무런 동작이 가능하지 않았기에 강제로 AWS 콘솔에 접속하여 EC2 인스턴스를 강제 종료 후 재부팅시켰더니 그 후엔 502 에러가 발생하였다.
- CloudWatch 모니터링 결과를 보면 특정 시점에 요청이 몰려있는 것이 보이는데 이 시점에 내가 이미지를 업로드하고 있었고, 그 밑의 사진에서 보이다싶이 3분 뒤 서버가 뻗어버렸다. (용량이 큰 이미지를 처리하는 것이 요청의 개수와 무관하지 않는듯)
- 따라서 용량이 큰 이미지를 리사이징하는 과정에서 과부하가 걸려 504 에러가 발생한 것으로 유추할 수 있다.
그럼 502 에러는 왜??
- 난 504 에러가 발생한 후 EC2 인스턴스를 재시작하였고, 완전히 재시작이 되고 나니 504 에러가 504 에러로 변경됐다.
- 앞서 언급한 것처럼 로드 밸런서의 문제인 것 같아 [EC2] - [로드 밸런싱] - [대상 그룹] 탭에 들어가보니 아래와 같이 unhealthy로 상태가 나와있는 것을 알 수 있었다.
- 쉽게 얘기하면 대상 인스턴스(여기서는 배포 중인 서비스 EC2)의 80포트의 상태가 좋지 않다 이런 의미이다.
- 먼저 로드 밸런서의 로그를 살펴보고 싶었으나 로드 밸랜서 액세스 로그를 활성화시키면 비용이 발생하기에 이를 활성화 시킨 적이 없어 로그를 따로 살펴볼 수 없었다.
- 또한 EC2와 서비스 자체는 정상적으로 실행 중인 상태였기에 별 다른 에러를 볼 수 있는 곳이 없었다.
뭘 잘못했을까?
- 결론부터 말하자면
nginx
가 꺼져있었다.
- 위의 과정까지 도달했을 때, 난 로드 밸런서가 80포트를 사용하지 못하는 점에 주목을 하였다. 즉, EC2도 멀쩡하고 Spring Server 역시 멀쩡한데 80포트를 사용하지 못하는 이유가 뭘까? 라는 점에서 접근하였고 매우 당연하기에 신경쓰지 않은, 바보같은 곳에서 문제의 원인을 찾을 수 있었다.
- EC2에 jar 파일이 실행 중인 것은 맞았으나 nginxr가 꺼져있었기에 로드 밸런서가 EC2의 80포트에 접근하지 못하였던 것이다.
ps -ef | grep java
를 입력했을 때 실행 중인 프로세스가 너무 명확하게 보였기에 당연히 nginx 역시 켜져있을 거라 생각했는데 아니었다..ㅠㅠ
- nginx를 시작해주고 나니 정상적으로 서비스에 접근할 수 있는 것을 확인하였다!
결론
- EC2 인스턴스를 재부팅한 후라면 nginx 상태 체크를 무조건 하자!!
- 아직 nginx, 로드 밸런서, 포트 포워딩같은 네트워크 관련 지식이 부족하다는 것을 깨달았습니다.
- 위 내용들을 다시 한 번 정리를 하는 시간을 갖도록 해야겠습니다.
댓글남기기