필자는 2022년, 프로젝트 진행을 할 적에 위의 개념을 마치 스쳐가는 인연인것처럼 눈으로만 기억하고 쿨하게 넘겨버렸다.
그때의 필자에겐 눈앞에 있는 코드를 구현하는데만 급급했기 때문이다. 그 후로 가끔 마주치는 웹 서버나 WAS를 볼때마다 어색한 우리 사이를 견디지 못해 피해버렸다.
그러나 한 번 만나면 우연, 두 번 만나면 인연, 세 번 만나면 운명인것처럼 이제는 때어낼 수 없는 우리의 관계를 진지하게 생각하고자 한다.
그런 고로 웹 서버와 WAS에 대해 정리해보자!
웹 서버란 무엇인가!
웹 서버: 웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
출처 - 위키백과
와 같은 개념이다.
필자는 웹 서버에 대한 개념을 Spring Boot로 개발을 진행하면서 알게 되었다.
Spring Boot 내에서는 Tomcat이 내장되어 있는데, Tomcat은 WAS(Web Application Server)로 웹 서버와 연관되어 있는 개념이다.
이는 웹 서버를 설명하고 나서 진행할 예정이다.
각설하고 웹 서버의 역할에 대해 알아보자.
이때 HTML, 이미지, CSS 파일 등 과 같은 파일은 정적 데이터이며 결국 웹 서버는 이러한 정적 데이터를 전달한다.
웹 서버로 유명한 것은
이며, 이중 나에게 유명한 Apache와 Nginx에 대해 알아보고 간단하게 비교해보자.
아파치는 가장 대표적인 HTTP 서버로 다음과 같은 특징이 있다.
장점
- 오픈소스이다.
- 다양한 모듈을 제공한다.
- 이전부터 명성이 있던만큼 커뮤니티에 자료가 방대하다.
- 확장성이 좋다.
- 보안 수준이 높다.
단점
- 많은 기능을 사용할 경우 느린 측면이 있다.
- 오버헤드가 발생한다.
아파치는 쓰레드 / 프로세스 기반 구조로 요청 하나당 쓰레드 하나가 처리하는 구조이며 하나의 쓰레드 - 하나의 클라이언트와 같은 구조로 사용자가 많으면 그 만큼 쓰레드가 생성되어 메모리 및 CPU 낭비가 발생한다.
때문에 대규모 트래픽을 감당하기에는 많이 벅찰 수 있다.
그래서 요즘 각광받는 것이 Nginx 이다.
Nginx는 트래픽이 많은 웹사이트의 서버(WAS)를 도와주는 비동기 이벤트 기반구조의 겨량화 웹 서버 프로그램이다.
클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Server로 활용하기도 한다.
Nginx는 다음과 같은 특징이 있다.
장점
- 오픈소스이다.
- Apache에 비해 가볍다.
- 프록시 기능이 뛰어나다.
단점
- 커뮤니티 자료가 부족하다.
- 확장 모듈이 Apache에 비해 적다.
Nginx는 이벤트 중심 접근 방식으로 클라이언트 요청을 제공하며, 제한된 하드웨어 리소스로도 여러 클라이언트 요청을 동시에 효율적으로 처리할 수 있다.
또한 단일 스레드를 통해 여러 연결을 처리할 수 있고 최소한의 리소스로 웹 서버의 아키텍처를 개선하기 위해 독립형 HTTP 서버로 배치 가능하다.
하지만 동적 컨텐츠를 기본적으로 처리할 수 없으며 이를 처리하기 위해서는 외부 프로세서에 요청을 전달하고 렌더링 된 컨텐츠가 다시 전송될때까지 기다려야 하므로 프로세스 속도 저하가 발생할 수 있다.
위의 웹서버들을 정리하자면
Apache는 클라이언트 접속마다 프로세스 혹은 쓰레드를 생성하는 구조이며, 클라이언트에 비례해서 CPU와 메모리의 사용량이 증가해 대용량 요청에서 한계가 보인다.
또한 Apache 서버의 프로세스가 Blocking 될 때 요청을 처리하지 못하고 처리가 완료될 때까지 대기상태에 있는다.
이는 Keep Alive(접속대기)로 해결이 가능하지만, 효율이 떨어진다.
Nginx는 Event-Driven 방식으로 동작하여 프로그램 흐림이 이벤트에 의해 결정된다.
한 개 또는 고정된 프로세스만 생성하고, 그 내부에서 비동기로 효율적인 방식으로 task를 처리한다.
Apache와 달리 동시 접속자 수가 많아져도 추가적인 생성비용이 들지 않으며, 적은양의 쓰레드 사용에 따라 CPU 소모가 적고 I/O들을 전부 Event Listener로 미루기 때문에 흐름이 끊이지 않고 Context Switching 비용이 적다
Context switching이란?
현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정.
이상으로 웹 서버에 대해 정리해 보았다.
마침 유튜브 우아한테크의 '마이크로 서비스 여행기' 라는 영상을 보고 Event 처리에 대한 호기심이 생겼었기 때문에,
이번 블로깅을 통해 Event-Driven 처리에 대해 궁금증이 생겼다.
추후에 WAS와 함께 Event-Driven도 블로깅 해봐야겠다.
끝!
https://server-talk.tistory.com/296
https://m.blog.naver.com/jhc9639/220967352282
https://dkswnkk.tistory.com/513
https://nesoy.github.io/articles/2018-11/Context-Switching