Nginx
Web Server이자 Reverse Proxy소프트웨어.
EC2 인스턴스 내부에 직접 설치해서 사용.
역할
- 리버스 프록시
- 외부 사용자가 EC2 인스턴스의 IP주소를 알고,
80(HTTP) 이나 443(HTTPS) 포트로 접속해 오면, Nginx가 맨 앞에서 요청을 받는다. (클라이언트는 WAS 서버 주소를 모름)
- 그리고 서버 내부 깊숙한 곳의
8080포트에서 돌고 있는 WAS로 트래픽을 안전하게 토스.
- 이유: 사용자가 WAS에 직접 접근하지 못하게 막아 보안을 강화하고, Nginx 선에서 불필요한 요청을 걸러내기 위해서.
- 정적 파일 처리 (WS)
- HTML, CSS, 단순 이미지 같은 정적 파일은 굳이 WAS에서 처리할 필요가 없다. Nginx가 앞단에서 이런 파일들을 즉각적으로 반환해 주어 WAS의 부담을 줄인다.
- 로드 밸런싱
- EC2 안에 WAS를 2개 띄워놨다면, Nginx가 “1번 요청은 8080으로, 2번 요청은 8081로” 번갈아 가며 트래픽 분산.
요청의 여정: 브라우저에서 스프링 부트까지
사용자가 브라우조 주소창에 http://EC2IP를 입력하고 엔터를 치는 순간부터의 흐름이다.
- VPC 경계면 (보안 그룹의 검문)
- 사용자의 요청 (
포트 80)이 AWS 네트워크에 도착한다.
- VPC의 보안 그룹이 이를 확인한다. “인바운드 규칙에 80번 포트가 열려있나?”
- 열려있다면, 패킷을 통과시켜 EC2 인스턴스(
Public Subnet에 존재) 안으로 들여보낸다.
- OS 레벨 (Nginx 만남)
- EC2의 운영체제(
Linux)는 “80번 포트로 누가 왔네? 이거 누가 담당이지?”라고 찾는다.
- 이때 80번 포트를 점유하고(
Listening) 대기 중이던 Nginx가 이 요청을 낚아챈다.
- Nginx 내부 (리버스 프록시 작동)
- Nginx 설정 파일(
nginx.conf)을 본다. 거기엔 아래와 같이 적혀있다.
- “80번으로 들어오는 모든 요청은 내부망에 있는
127.0.0.1:8080(WAS)으로 넘겨줘.
- 여기서 Nginx가 클라이언트를 대신해 내부적으로 스프링 부트에게 말을 건다.
- 애플리케이션 도착 (최종 처리)
- 스프링 부트가 요청을 처리하고 결과를 Nginx에게 준다.
- Nginx는 다시 그 결과를 브라우저에게 돌려주면서 여정이 끝나게 된다.
무중단 CI/CD에서 Nginx의 역할
- 새로운 버전을 띄우는 동안에도 기존 버전이 찰나의 끊김 없이 트래픽을 받아내는 것.
- 하나의 EC2 내부에서 Blue/Green 배포를 구현할 때 Nginx가 트래픽의 ‘스위치’ 역할을 한다.
- Nginx를 활용한 무중단 배포 시나리오 (포트 스위칭)
- 현재 상태 (Blue 운영 중)
- Nginx는 외부 트래픽을 받아
8080 포트에서 돌고 있는 WAS로 보내고 있다.
- CI/CD 파이프라인 가동 (Github Actions → CD)
- 개발자가 새 코드를 푸시하면, 파이프라인이 돌아 EC2 내부로 최신
.jar 파일을 가져온다.
- 새 버전 실행 (Green 준비)
- 기존 WAS는
8080에서 멈추지 않고 계속 서비스하는 동안, 다른 WAS를 남는 포트인 8081 포트에 백그라운드로 조용히 실행시킨다.
- 상태 확인 (Health Check)
- V2 WAS가 정상 구동된 것을 확인하면, Nginx의 설정 파일을 수정하여 “이제부터 들어오는 트래픽은
8081 포트로 보내”라고 지시.
- 그리고
nginx -s reload 명령어를 실행. 서버를 껐다 켜는 것이 아니라, 0.1초의 끊김도 없이 설정만 새로고침
- 구버전 종료 (Blue 삭제)
- 모든 트래픽이 새 버전으로 무사히 흘러가는 것을 확인했으니, 더 이상 트래픽을 받지 않는 구버전을 종료.
EB 방법으로 배포 시 EC2와 WAS(Tomcat)의 관계
- EB에 WAS를 업로드하면, EB는 빈 EC2 인스턴스를 하나(또는 여러 대)를 생성. 그리고 그 EC2 내부에서 WAS가 실행되는데, 이때 내장되어 있는 Tomcat이 구동. 결과적으로 EC2라는 컴퓨터 내부에서 Tomcat이라는 WAS가 돌아간다.
EC2 내부의 Nginx와 무중단 배포 방식