1. 개요
Tripot 프로젝트 첫 배포에 앞서 무중단 배포를 구축해보려 한다.
현재 환경에서 스프링부트 애플리케이션이 정상적으로 실행되는 데 대략 30초정도가 걸린다. CI/CD를 이용하여 배포를 진행하게 되면 30초가량 사용자가 서비스를 이용할 수 없음을 뜻한다. 현대에 이런 서비스는 존재하지 않는다.
몇 가지 경우를 찾다가 nginx를 사용하여 구축하는 방법을 택했다. 그런데 어떤 기술인지 알아야 제대로 쓸 것이 아닌가? 이 포스팅에서는 nginx가 어떤 건지 알아보고, 이를 사용해야 하는 이유를 기술하고자 한다.
2. Nginx란?
Nginx는 "웹 서버" 이다. 간단히 말해 html, css 등 정적인 컨텐츠를 제공하는 프로그램이다. 보통 WAS와 묶어서 이야기하는 데 차이점을 간단히 짚고 넘어가보자.
- 웹 서버: 정적인 컨텐츠를 제공하는 프로그램
- WAS를 거치지 않고 바로 자원을 제공
- WAS만 사용하는 것에 비해 성능이 좋음
- Apache Server, Nginx 등
- WAS: Web Server + Web Container
- 다양한 로직 처리를 요구하는 동적 컨텐츠를 제공하기 위한 서버
- DB 접속 및 트랜잭션 관리 기능 수행
- Tomcat, Web Sphere 등
WAS에 웹 서버가 포함되어 있는데 왜 굳이 웹 서버를 사용하는가?
- 서버의 성능 향상: WAS는 동적 컨텐츠를 처리하느라 바쁘므로 웹 서버와 기능을 분리하여 각자의 역할을 맡아 수행 속도를 빠르게 할 수 있다.
- 보안 강화: SSL에 대한 암/복호화 처리를 시킬 수 있다.
- 여러 WAS를 연결 가능: 로드 밸런싱을 수행시켜 여러 개의 WAS와 연결시킬 수 있다 -> 무중단 배포가 가능하다!
3. 왜 Nginx?
그렇다면 차고 넘칠 웹 서버 중 왜 Nginx인가? 사실 이 이전에 대중적으로 사용하던 웹 서버가 하나 있었다.
3-1. Apache Server
Nginx 이전에 널리 사용되던 웹 서버이다. 이때는 웹 서버 점유율 1위였으나 C10K 문제를 직면하여 이를 해결하기 위해 만든 소프트웨어가 Nginx이다.
- C10K 문제: 1만개의 소켓을 열게 되면 하드웨어 성능이 충분함에도 메모리, context switching 중 race condition 등의 문제로 프로세스가 제대로 처리를 하지 못하는 문제
3-2. 해결
Nginx는 이를 Event Driven 방식을 이용하여 해결하고자 하였다.
- 프로세스를 한개만 사용하고, 여러 Connection을 하나의 스레드에서 비동기 방식으로 처리한다.
- 다수의 연결을 효과적으로 처리할 수 있다.
- Apache보다 더 적은 스레드로 더 빠른 처리가 가능하다.
상기한 이유로 현재는 Nginx가 Apache 서버의 점유율을 넘어서게 되었다.
3-3. 리버스 프록시
- 클라이언트와 서버 사이의 서버로 존재하여 클라이언트의 요청을 서버로 보내고, 받은 응답을 다시 클라이언트로 전송한다.
- 80포트로 요청을 받아 여러 포트 중 골라 처리하는 로드밸런서의 역할을 수행할 수 있다.
- 해당 서비스는 ip와 포트번호가 가려지게 되어 보안상의 이점을 가져갈 수 있다.
- 이를 이용하여 무중단 배포를 구현할 수 있다.
4. 구조
- 하나의 Manager와 다수의 Worker로 구성되어있다.
- 다른 master-slave 구조가 그렇듯 master가 slave에게 일을 할당하고, slave는 할당받은 일을 처리한다.
5. 마무리
nginx의 기본적인 개념, 동작 방식에 대해 알아보았다. 다음에는 무중단 배포의 종류와 이 중 어떤 걸 선택할 지 알아보고, 직접 구축하는 과정까지 진행해볼 예정이다.
참고 문헌
https://velog.io/@choidongkuen/%EC%84%9C%EB%B2%84-Nginx-%EB%9E%80
[서버] Nginx 란?
업로드중..
velog.io
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
[Web] Web Server와 WAS의 차이와 웹 서비스 구조 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
https://techlog.gurucat.net/390
웹 서비스 구조(feat. SpringBoot와 nginx)
스프링부트 개념 우선 스프링 부트. '스프링 프레임워크'의 사이드 프로젝트로 시작되어 만들어진 웹 애플리케이션 프레임워크다. Java를 기반으로 한다. '스프링 부트'가 등장하기 전 '스프링 프
techlog.gurucat.net
https://oliveyoung.tech/2023-10-02/c10-problem/
고전 돌아보기, C10K 문제 (C10K Problem) | 올리브영 테크블로그
오래된 과거에서 시작하는 Node.js의 비동기 처리로의 여정
oliveyoung.tech