엔빵이라는 정산 어플리케이션을 개발을 진행하며, 해당 서비스를 호스팅을 하기위해 AWS를 사용하게 되었다.
공부를 하는 차원으로 개발을 하는것이라서 AWS 과금이 되는걸 원치 않았다.
그래서 프리티어 기준에 맞춰서 하나의 EC2로 웹서버, API서버를 구동을 해야했다.
그렇다 보니 위와 같은 상황이 발생이 되었다.
웹서버는 3000 포트로, API서버는 8000 포트로 실행되고있었는데,
사용자가 nbbang.shop 으로 접속을 하면 3000 포트로 연결이 되어야하고
사용자의 브라우저에서 어떠한 액션으로 API 서버로 요청이 되면
nbbang.shop/api/~ 요청이 8000 포트로 요청이 되어야했다.
그래서 NGINX 를 사용하여
- HTTP(:80)요청을 HTTPS(:443)로
- HTTPS(:443)요청을 웹서버(:3000)로
- host/api/~(:443)요청을 API서버(:8000)로
로드밸런서 설정을 하였으나, 순간 EC2의 CPU 사용량이 90%를 넘어가더니 서버의 응답이 너무나 느려졌다.
정확히 무엇떄문에 EC2가 과부화가 되었는지 알수가 없었던 상황,
웹서버와 API서버를 한EC2 에서 구동해서? 라는 가설을 세워봤으나, 그렇다고 EC2를 두개를 사용할수는 없었다.
두번째 가설로 NGINX 서버가 추가 되어서? 라는 가설을 기반으로
AWS의 ELB(Elastic Load Balancing)를 사용해보기로 했다.
ELB의 HTTP 리스너 규칙을 위와 같이 설정하여 HTTP요청은 HTTPS로 리디렉션 시킨다
EC2 :3000 으로 라우팅할 대상그룹(nbbang-fornt)을 생성한다,
그리고 ELB의 HTTPS 리스너의 기본규칙으로 해당 대상그룹을 지정한다
EC2 :8000 으로 라우팅할 대상그룹(nbbang-back)을 생성한다,
ELB의 HTTPS 리스너의 규칙을 (path 경로가 host/api/~) 추가하고 대상그룹을 지정한다.
위와 같이 NGINX를 사용한 로드밸런서 서버 대신 AWS에서 도메인에서 EC2에 라우팅 되는 과정에서 로드밸런서를 사용하니 과부화 되었던 서버가 다시 안정적으로 구동이 되었다.
NGINX를 사용할때 API서버에 HTTPS 연결을 위한 SSL 인증서 설치 과정도 건너뛸수 있어서 더욱 간단하게 구축이 가능했다.
+ 포스팅을 작성하면서 NGINX 에 대해서 다시 찾아보니 매우 가벼운 웹서버 프로그램으로 소개가 되어있다. NGINX 사용을 그만하니 CPU 사용량은 10%도 안나오긴하는데, 문제점을 정확히 파악을 하지 않아서 NGINX 문제라고 보긴 어려울거같다..
NGINX 대신 AWS ELB를 사용하는 방법에 대한 포스팅이 되었으면 한다.