Nginx(엔진엑스) 개념정리 및 설치, Blue/Green 무중단배포란?
Nginx 란?
시장에서 점유율이 높은 apache와 같은 웹서버 중 하나로 가벼우면서 여러 요청을 한 번에 처리할 수 있는 장점을 가진다. 또 apache 보다 동작이 단순하고 전달자 역할만 하기 때문에 동시접속에 특화되어 있다.
예를 들어 동시접속자가 700명 이상이라면 서버를 증설하거나, nginx 환경을 권장한다고 할 정도로 성능이 좋고 다중접속에 특화되어있다.
nginx의 구동 방식은 Event Driven(비동기처리방식)으로 요청이 들어오면 어떤 동작을 해야하는지만 알려주고 다른 요청을 처리하는 방식이다.
그렇기 때문에 CPU와 관계없이 모든 입/출력들을 전부 Event Listener로 전달해서 흐름이 끊기지 않고 응답이 빠르게 진행되어 1개의 프로세스로 보다 더 빠른 작업이 가능하게 된다.
🍀 동기 vs 비동기
동기(Synchronous)
- A가 B에게 데이터를 요청했을 때, 이 요청에 따른 응답을 줘야지만 A가 작업을 처리할 수 있다.
- 즉, 하나의 요청에 하나의 작업을 충실하게 한다는 뜻
비동기(Asynchronous)
- A의 요청을 B가 즉시 주지 않아도, A의 유휴시간으로 또 다른 작업 처리가 가능한 방식
Nginx의 역할
HTTP 서버 역할
웹서버의 역할은 HTML, CSS, JavaScript, 이미지와 같은 정적인 정보를 웹 브라우저(Chrome, Explore, Opera, FireFox 등)에 전송하는 역할을 한다.
리버스 프록시(Reverse Proxy) 역할
서버 앞단에 웹서버를 이용하여 사용자가 바로 서버에 접근하지 않고 앞에 있는 웹서버에 요청을 하도록 하는 역할이다. 사용자의 요청에 따라 리버스 프록시 서버(Nginx)는 서버의 포트나 디렉토리에 연결하여 준다.
이렇게 되면 사용자가 직접하는 요청과 프록시 서버를 거친 요청이 다르기 때문에 직접적으로 노출되지 않는 보안상 이점이 있고, 하나의 요청을 분배하여 여러 형태로 처리하는 분산처리가 가능하게 된다.
AWS에 Nginx 설치(Ubuntu Server 22.04 LTS)
1. apt 업데이트
Ubuntu에는 기본적으로 apt가 설치되어있기 때문에 사용 전 업데이트 및 업그레이드 하면 된다.
- 패키지 인덱스 정보 업데이트
$ sudo apt update
- 패키지 업그레이드
$ sudo apt upgrade
Ubuntu APT란?
- APT(Advanced Packaging Tool)
- 데비안과 우분투를 포함하여 데비안(debian) 계열 리눅스 배포판들의 주 패키지 관리 도구
- apt 관리 도구인 apt-get과 apt-cache에서 자주 사용하는 명령어들을 통합하여 보다 사용자 친화적으로 고안된 새 apt 패키지 관리 도구
- 리눅스 시스템에 패키지를 설치하고 제거하는데에 사용
apt 사용법 참조 블로그
: http://taewan.kim/tip/apt-apt-get/
2. Nginx 설치
# apt install [패키지명] -> 패키지 설치
$ sudo apt install nginx
# apt remove nginx [패키지명] -> 패키지 삭제
$ sudo apt remove nginx
3. Nginx 시작, 종료, 재시작, 상태, 실행 테스트
$ sudo service nginx start # nginx 시작
$ sudo service nginx stop # nginx 종료
$ sudo service nginx restart # nginx 재시작
$ sudo service nginx status # nginx 상태
$ sudo nginx -t # 실행 테스트
- Active 에 active (running)을 보면 nginx가 실행 중인것을 알 수 있다.
- nginx 종료
Spring Boot + Nginx 사용하여 무중단 배포
무중단 배포란?
예전에 배포라고 하면 클라이언트가 서비스를 사용하지 않는 새벽 시간대에 남아 서비스를 정지하고 배포를 진행하였다. 이 때, 치명적인 문제가 발견되면 아침까지 또는 클라이언트가 사용해야하는 시간이라면 긴급점검을 걸고 문제를 해결했어야 했다. 이렇게 되면 롤백조차 어렵기 때문에 배포의 부담이 매우 컸다.
위처럼 서비스를 정지하지 않고 서비스를 배포할 수 있는 방법이 무중단 배포이다.
Blue / Green 무중단 배포
가장 간단하고 쉽게 무중단 배포를 할 수 있는 방법으로서 기본적으로 릴리즈와 관련된 모든 시간을 줄이기 위한 기술.
위의 그림과 같이 사용자는 서버 포트로 접속을 하고 Nginx는 해당 Spring boot로 요청을 전달한다.
👉 현재 사용 중인 서비스는 port 9001인 ver 1.0 이다.
이 때 새로운 버전인 ver 1.1을 배포해야한다고 가정한다면 두 번째 그림처럼
port 9002에서 ver 1.1을 띄운 후 Nginx가 port 9002를 볼 수 있게 스위칭 한 뒤 nginx를 reload 하면 된다.
nginx는 reload하는데 1초 정도 걸리기 때문에 평소보다 많은 시간을 줄일 수 있다.
또, 배포 후 문제가 발생한다면 바로 port 9001를 바라보게 한 뒤 reload하고 port 9002에 있는 버전 1.1 문제 해결한 뒤 재 배포를 할 수 있다.
EC2를 사용한 배포 순서
1. EC2 1대에 Nginx 및 JDK를 설치
2. CI tool 사용하여 JAR 파일이 EC2에 전송되면 미리 준비된 EC2 내부의 쉘 스크립트를 실행
3. 해당 쉘 스크립트를 통해 현재 9001 포트에 실행 중인 JAR이 있는지 확인
- 없다면, JAR를 9001 포트로 실행
- 클라이언트가 EC2 80포트로 요청을 보내면 9001 포트로 전달 되도록 Nginx 설정 파일을 수정하고 Reload
- 기존 9002 포트에서 실행중이던 JAR 프로세스를 종료 👉 새로 배포될 JAR 파일 실행
- EC2 80 포트로 들어온 요청을 9002 포트로 전달하도록 Nginx 설정 파일을 수정하고 Reload
- 기존 9001 포트에서 실행 중이던 JAR 프로세스 종료
4. 신규 코드 배포가 발생할 때 마다 JAR 실행 포트가 01 👉 02 👉 01 ... 식으로 스위칭
📢
cicd : jenkins(젠킨스)
EC2 : ubuntu 20.04 LTS
Docker
Nginx
사용하여 무중단배포 진행하는 부분은 따로 블로그를 작성할 예정