본문 바로가기

Nginx

Hello, Nginx(feat. 무중단 배포)

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에 웹 서버가 포함되어 있는데 왜 굳이 웹 서버를 사용하는가? 

  1. 서버의 성능 향상: WAS는 동적 컨텐츠를 처리하느라 바쁘므로 웹 서버와 기능을 분리하여 각자의 역할을 맡아 수행 속도를 빠르게 할 수 있다.
  2. 보안 강화: SSL에 대한 암/복호화 처리를 시킬 수 있다.
  3. 여러 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