
테커 부트 캠프 프로젝트에서 사용하는 기술 스택 중에 Nginx가 있다. 간단하게 말하면 프론트와 백엔드 서버를 연결해주는 매개체라고 말할 수 있겠다. 이참에 같이 공부해야지! 마인드 장착하고 velog에도 공유해 보려고 한다 〰️
: 트래픽이 많은 웹사이트의 서버(WAS)를 도와주는 비동기 이벤트 기반 구조(Event Driven)의 웹 서버 프로그램
Event Driven(비동기처리방식)은 요청이 들어오면 어떤 동작을 해야 하는지만 알려주고 다른 요청을 처리하는 방식이다.
CPU와 관계없이 모든 입출력(IO)들을 전부 Event Listener로 전달하기 때문에 흐름이 끊기지 않고, 응답이 빠르게 진행되어 1개의 프로세스로 더 빠른 작업을 가능
→ 메모리적인 측면에서 Nginx가 System Resource를 적게 처리
스레드 / 프로세스 기반 구조
클라이언트 요청 하나당 스레드 하나가 처리하는 구조로, 사용자가 많을 시(= 요청이 많을 시), 스레드 생성, 메모리/CPU 낭비가 심해 성능이 저하될 수 있다. 처리 방식으로는 Prework, Worker 두 가지 방식이 있다.
MPM(Multi Processing Module: 다중 처리 모듈) 방식 처리
아파치 서버는 요청이 들어오면 커넥션을 형성하기 위해 프로세스를 생성한다. 즉, 새로운 요청이 들어올 때마다 프로세스를 새로 만든다. 프로세스를 생성하는 과정은 시간이 오래 걸리기 때문에 프로세스를 미리 만들어 놓고, 새로운 클라이언트의 요청이 오면 미리 만들어 놓은 프로세스를 할당했다.
덕분에, 개발자는 다양한 모듈을 만들어서 서버에 빠르게 기능을 추가할 수 있어 확장성이 높았고, 동적 컨텐츠를 처리할 수 있게 되었다.
확장성이 높다? ⇒ 요청을 받고 응답을 처리하는 과정을 하나의 서버에서 해결하기 좋다!
하지만, 1999년에 들어오면서 컴퓨터의 보급에 따라 요청이 많아져서 서버에 동시에 연결된 커넥션이 많을 때 더이상 새로운 커넥션을 생성하지 못하게 되었고, 이를 C10K(Connection 10000 problem) 문제라고 한다.
Apache의 구조적 문제 3가지
수많은 동시 커넥션을 감당하기엔 아파치 서버의 구조가 적합하지 않았고, 2004년에 아파치 서버를 보완하기 위한 소프트웨어, Nginx가 나왔다.
Nginx는 하나의 Master Process와 다수의 Worker Process로 구성되어 실행된다.
Master Process에서는 설정 파일을 읽고 유효성을 검사하며, Worker Process를 관리한다. Worker Process에서는 요청을 처리하고, Worker Process의 개수는 설정 파일에서 정의되며, 정의된 프로세스의 개수와 사용 가능한 CPU 숫자에 맞게 자동으로 조정된다.

이렇게 Nginx는 프로세스를 효율적으로 활용함으로써 서버 자원을 최대한 활용하고, Event Driven을 활용한 비동기 Non-Blocking 방식으로 프로세스 작업이 끝날 때까지 대기하지 않아도 된다.
Non-Blocking?
: 앞의 프로세스가 작업을 수행중이더라도, 다음 프로세스는 기다리면서 다른 작업을 할 수 있는 방식
