안녕하세요 오늘은 현재 가장 많은 사랑을 받고 있는 웹 서버
인 Nginx
에 대해서 알아보겠습니다.
요즘 프로젝트를 진행하면서 Nginx
도입에 대해 고려중인데, 실제 적용해보기 전에 개념정리가 필수적이라 생각해서 이번 포스팅을 제작합니다 👨💻
이번 포스팅은 Web Server
와 WAS
에 대한 선제적인 이해가 필요합니다.
[Spring] Spring MVC - Servlet, Servlet Container, Spring Container 에 대해 을 참고해주세요 ❗️
인터넷을 기반으로 클라이언트에게 웹 서비스를 제공하는 컴퓨터 혹은 프로세스
클라이언트 입장에서는 웹 서버에게 주소를 가지고 통신 프로토콜에 맞게 요청을 하면 정적 파일(페이지)를 응답으로 받습니다.
서버 입장에서는 클라이언트의 요청을 기다리고, 웹 요청에 대한 데이터를 만들어서 응답합니다 이때, 데이터는 웹에서 처리 가능한 html
,css
,이미지
등의 정적 파일(페이지)로 한정됩니다.
해당 이미지는 Web Server
의 동작원리를 잘 보여줍니다.
Client 는 자신이 필요한 정적인 페이지의 주소를 가지고 요청을 하여 필요한 정적인 데이터를 얻습니다.
결국, Web Server
는 정적인 페이지만 처리 가능하다는 한계가 있기 때문에, 비즈니스 로직이 필요하며 DB 접근이 필요한 즉 동적인 페이지를 처리하지 못합니다.
이를 위해 Web Application Server(WAS)
가 출현합니다 ❗️
앞에서 살펴본 웹 서버
에는 대표적으로 Apache Server
와 Nginx
가 있습니다.
Nginx
가 탄생하기 전 Apache Server
는 매우 혁식적인 웹 서버로 여겨졌습니다.
왜냐하면 기존 웹 서버 방식(apache server 전)에는 많은 버그가 많았기 때문에 클라이언트가 사용하기에 매우 불편했기 때문입니다.
Apache 재단에서 만든 Http Web Server
이며, 굉장히 다양하고 기능적인 면에서 우수합니다.
또한, 거의 모든 OS 에서 실행되며, 다른 유명한 스프트웨어 프로젝트와의 문서화가 잘 되어있고 통합 지원 등의 이점이 있습니다.
쓰레드/프로세스 기반 구조
Apache Server
는 클라이언트의 요청이 들어오면Connection
을 생성합니다. 즉 요청마다Thread
을 만들어서 처리합니다.
즉, 클라이언트 요청당 하나의 쓰레드가 처리하는 구조이며, 사용자가 많으면 쓰레드 생성, 메모리 및 CPU 낭비가 심합니다 🤔
Prefork MPM 방식
Client
의 요청에 대해Apache
자식 프로세스를 생성하여 처리하며, 부모 프로세스로 부터 생성된 자식 프로세스는 하나의 쓰레드를 갖는 구조이며, 응답 프로세스를 미리 띄어놓고 클라이언트 요청 시 자식 프로세스가 반응합니다.
1900 년대 컴퓨터가 많이 보급되기 이전에는 Apache Server
는 기존의 웹 서버를 대체 할 수 있는 매우 혁식적인 웹 서버였습니다.
하지만 컴퓨터 보급률이 기하급수적으로 올라가면서, Apache Server
에 동시에 많은 클라이언트가 요청을 보내게 되었고 Apache Server
의 한계가 드러나기 시작합니다 😱
앞에서 살펴보았던 것처럼 Apache Server
는 클라이언트의 요청 마다 Connection
을 생성하며 이는 곧 프로세스/쓰레드 생성을 의미합니다.
하지만 대량의 클라이언트(1만 이상) 가 동시에 Connection
을 맺는다면 CPU/메모리
사용이 증가하고 프로세스/쓰레드
생성 비용이 드는 등 요청에 한계가 존재합니다 🚫
이를 C10k(Connection 10000 problem)
라고 합니다. 즉 1만개 이상의 동시 Connection 에는 Apache Server
에 문제가 생길 수 있다는 거겠죠?
또한, Apache Server
의 프로세스가 blocking 될 때 요청을 처리하지 못하고 처리가 완료될 때까지 대기상태에 있습니다.
Keep-Alive
방식으로 이를 해결할 수 있지만 효율이 떨어집니다.
결국, 현대로 오면서 개발자들은 Apache Server
사용에 대해 많은 고민을 했고 이러한 구조적인 문제를 해결한 Nginx
가 2004 년 등장합니다 ❗️
초창기 Nginx
는 Apache Server
의 구조적인 문제를 해결하기 위헤 함께 사용되었습니다.
Nginx
또한 웹 서버였지만 그당시 완전히 Apache Server
을 대체할 목적은 아니였으며, Apache Server
의 문제점을 보완하는 용도로 사용되었습니다.
해당 이미지 처럼 클라이언트의 동시다발적인 Connection 을 Nginx
가 유지하면서 동시에 정적 파일에 대한 요청을 스스로 처리했습니다.
만약 클라이언트로부터 동적 파일 요청을 받았을 때 만 Apache Server
와의 Connection 을 형성하여 Apache Server
의 부하를 줄였습니다 ❗️
해당 이미지는 Nginx
의 구조를 도식화한 이미지입니다.
Nginx
는 master process
을 생성하는 worker process
을 가집니다.
worker process
는 실제로 일을 하는 프로세스이며 worker process
가 만들어 질 때 지정된 listen 소켓을 배정받습니다.
그리고 해당 소켓에 새로운 클라이언트의 요청이 들어오면 connection 을 형성하고 처리합니다.
Nginx 에서는 이러한 connection 형성과 제거, 그리고 새로운 요청을 처리하는 것을 이벤트(Event) 라고 하며, 이러한 방식을 이벤트 기반(Event-Drvien) 방식이라고 합니다.
connection 은 정해진 Keep-Alive
시간만큼 유지되며 여기서 중요한 구조적 특징은 connection 이 형성되었다고 해서 worker process
는 해당 connection 하나만 담당하지 않습니다 ❗️
해당 이미지에서 볼 수 있듯이, worker process
는 os 커널로부터 connection 을 queue 형식으로 전달받습니다 🎁
worker process
로 전달된 queue 에 담긴 이벤트들은 비동기 상태로 대기하며 worker process
는 queue 에서부터 이벤트를 하나씩 꺼내어 처리합니다.
여기서 worker process
는 하나의 쓰레드 로 동작하며, 이러한 구조적 특성 덕분에 connection 마다 쓰레드를 생성했던 Apache server
보다 훨씬 효율적으로 자원 사용이 가능하며, 요청 처리율도 월등히 높습니다.❗️
해당 이미지에서 볼 수 있듯이, 이벤트 기반 방식의 Nginx
는 Event Handler
을 통해 비동기 방식으로 여러 connection 을 처리합니다
이러한 이벤트 기반 구조
가 Apache Server
와 구분되는 Nginx
의 핵심입니다 ❗️
[Nginx 구조와 동작원리 정리]
master process
는 worker process
을 생성하며 실제 connection 에 대한 처리는 worker process
가 처리합니다.worker process
는 단일 쓰레드(Single Thread) 로 운영됩니다.Nginx
는 os 커널로 부터 queue 형식으로 이벤트를 전달받으며 하나씩 처리합니다.Apache Server
에 비해 자원의 효율성이 좋으며, 요청 처리율도 좋습니다.현대에는 많은 개발자들이 Apache Server
사용을 하지 않고 Nginx
을 단독으로 웹 서버로 구축합니다.
여기에는 다양한 이유가 있습니다.
1. 자원의 효율적인 사용 : Apache Server
처럼 클라이언트의 요청마다 thread 을 생성하는게 아니라 Worker Process
즉, 단일 thread 을 이용하여 자원의 효율성을 보장합니다. 이때문에 적은 메모리 사용 & CPU 사용을 보장합니다.
2. 동시적인 요청 처리 : 여러 요청을 비동기적인 이벤트 기반으로 동시의 처리합니다.
3. 강력한 설정 : Nginx
의 설정 파일 구문은 간단하고 유연하여 사용자가 서버 동작을 세밀하게 제어할 수 있습니다.
4. Reverse Proxy : Nginx
는 우수한 Reverse Proxy 기능을 제공하여 백엔드 서버로의 요청을 분산하고 로드 밸런싱을 수행할 수 있습니다.
5. 커뮤니티 및 지원 : Nginx
는 방대한 커뮤니티와 다양한 문서,자료,지원을 제공합니다.
결국
Event-Driven
방식으로 동작하기에 이벤트에 의해 프로그램 흐름이 결정이됩니다.
한 개 또는 고정된 프로세스만 생성하고, 그 내부에서 비동기로 효율적인 방식으로 task 을 처리합니다.
따라서 동시 접속자 수가 많아져도 추가적인 생성비용이 들지 않습니다 🔥
자 그럼 이번에는 Nginx
의 단점을 알아볼까요?
1. 동적 컨텐츠를 기본적으로 처리 할 수 없습니다.
2. 동적 컨텐츠를 처리하기 위해서는 외부 자원과 연계가 불가피합니다.
Nginx란?
Nginx란 무엇인가?
Apache와 NginX 비교, 차이점
웹 서버 : Nginx vs Apache