티스토리 뷰
이번 포스팅에서는 Nginx 웹 서버를 통해서 로드밸런싱 역할을 하는 Reverse Proxy를 구축하는 방법을 정리한다.
# 사전 용어 정리
웹 서버 - 정적 컨텐츠를 제공하는 서버 (주로 정적 컨텐츠 캐싱이나 리버스 프록시 용도로 사용)
WAS - 동적 로직을 수행하는 서버 (디비와 연결)
리버스 프록시 (Reverse Proxy) - 먼저 트래픽을 받고 뒷단(Reverse)에 있는 WAS에게 전달해 주는 웹 서버
*스프링 부트의 Dispatcher Servlet을 생각하면 편하다
로드밸런싱 - 트래픽을 분산 처리하는 이정표 같은 역할
# 시나리오
Nginx가 로드밸런서 역할을 해서 트래픽을 라운드로빈 방식으로 두 개의 EC2에 각각 분산 처리하도록 구성할 것이다.
향후 두 인스턴스는 부하 분산 처리도 수행하며, 무중단 배포(블루/그린)을 위해서 해당 아키텍처로 구성했다.
Nginx 설정을 먼저하고, 트래픽이 잘 나누어지는지 데모 서버를 각각 블루/그린에 띄워서 테스트해 볼 것이다.
로드밸런서 역할을 ALB(Aws Load Balancer)를 활용할 수도 있지만, 이 글에서는 Nginx를 활용해서 구현해 본다.
사전 준비물
- AWS EC2 (t2.micro) 3개 (Nginx, blue, green) - ubuntu 20.04
- 테스트용 demo spring boot 서버 jar 2개 (헬스체크 가능한 엔드포인트가 있는 것)
# Nginx 설정
sudo apt-get update // 업데이트
sudo apt-get install nginx // nginx 설치
nginx -v를 입력해서 잘 설치되었는지 확인한다.
Nginx가 잘 설치되었다면, 실행해 준다.
sudo systemctl nginx start
Nginx 설정 파일을 수정하기 위해 다음 디렉토리로 이동한다.
cd /etc/nginx/sites-enabled
sudo vi default
아래 화면으로 이동한다.
중간에 내리다 보면, location 으로 시작하는 부분에 다음 코드를 추가한다.
초기엔 try_files $uri $uri/ =404; 가 주석처리 되어있지 않는데, 꼭 주석처리를 해준다. (안 그러면 uri 요청을 했을 때, 404로 내려갈 것이다.)
아래 server 블록이 끝나는 부분에 다음 코드를 추가한다.
이제 설명을 하자면, proxy_pass는 위에서 설정한 upstream으로 요청이 들어오면 트래픽을 전달해 주겠다는 뜻이다.
(밑에 proxy_로 시작하는 건 옵션이다.)
upstream 뒤에 오는 건 커스텀 이름으로 마음대로 설정하면 된다. 이제 proxy_pass http://설정한이름 으로 지정만 해주면 된다.
upstream 블록 내부 server에는 서버 ip:port 형식으로 입력하면 된다.
해당 블록내부에 server 위에는 로드밸런싱 알고리즘을 명시할 수 있는데, 디폴트는 라운드로빈이다.
least_conn -> 가장 연결 클라이언트가 적은 서버로 트래픽을 돌림
ip_hash -> ip 해싱을 통해 특정 서버로 지정하는 것. 트래픽이 몰릴 수도 있으니 주의할 것
예시)
upstream {
least_conn;
server {IP}:{PORT};
}
이렇게 작성하면 :wq를 눌러서 저장하고 나와준다.
그리고 Nginx를 재가동시켜준다.
sudo nginx -s reload
이제 Nginx가 설치된 웹 서버 아이피로 접속하면 뒷단의 서버로 트래픽을 전달해 줄 것이다.