[Nginx] Nginx, 어떻게 동작하는건데?

kubit·2023년 7월 19일

Nginx

목록 보기
1/3
post-thumbnail

테커 부트 캠프 프로젝트에서 사용하는 기술 스택 중에 Nginx가 있다. 간단하게 말하면 프론트와 백엔드 서버를 연결해주는 매개체라고 말할 수 있겠다. 이참에 같이 공부해야지! 마인드 장착하고 velog에도 공유해 보려고 한다 〰️

Nginx

Nginx?

: 트래픽이 많은 웹사이트의 서버(WAS)를 도와주는 비동기 이벤트 기반 구조(Event Driven)의 웹 서버 프로그램

Event Driven(비동기처리방식)은 요청이 들어오면 어떤 동작을 해야 하는지만 알려주고 다른 요청을 처리하는 방식이다.

CPU와 관계없이 모든 입출력(IO)들을 전부 Event Listener로 전달하기 때문에 흐름이 끊기지 않고, 응답이 빠르게 진행되어 1개의 프로세스로 더 빠른 작업을 가능
→ 메모리적인 측면에서 Nginx가 System Resource를 적게 처리

Nginx의 배경, Apache HTTP Server

Apache?

스레드 / 프로세스 기반 구조

클라이언트 요청 하나당 스레드 하나가 처리하는 구조로, 사용자가 많을 시(= 요청이 많을 시), 스레드 생성, 메모리/CPU 낭비가 심해 성능이 저하될 수 있다. 처리 방식으로는 Prework, Worker 두 가지 방식이 있다.

MPM(Multi Processing Module: 다중 처리 모듈) 방식 처리

  • Prefork MPM (멀티 프로세스 방식)
    하나의 자식 프로세스가 하나의 스레드를 갖는 구조로, 하나의 요청이 들어오면 독립적인 메모리 공간을 가지는 하나의 자식 프로세스가 생성된다.
  • Worker MPM (멀티 프로세스+멀티 스레드 방식)
    하나의 프로세스가 각각 여러 스레드를 갖는 구조로, 하나의 스레드에서 하나의 요청을 처리하는 방식으로 동작한다.

아파치 서버는 요청이 들어오면 커넥션을 형성하기 위해 프로세스를 생성한다. 즉, 새로운 요청이 들어올 때마다 프로세스를 새로 만든다. 프로세스를 생성하는 과정은 시간이 오래 걸리기 때문에 프로세스를 미리 만들어 놓고, 새로운 클라이언트의 요청이 오면 미리 만들어 놓은 프로세스를 할당했다.

덕분에, 개발자는 다양한 모듈을 만들어서 서버에 빠르게 기능을 추가할 수 있어 확장성이 높았고, 동적 컨텐츠를 처리할 수 있게 되었다.

확장성이 높다? ⇒ 요청을 받고 응답을 처리하는 과정을 하나의 서버에서 해결하기 좋다!

하지만, 1999년에 들어오면서 컴퓨터의 보급에 따라 요청이 많아져서 서버에 동시에 연결된 커넥션이 많을 때 더이상 새로운 커넥션을 생성하지 못하게 되었고, 이를 C10K(Connection 10000 problem) 문제라고 한다.

Apache의 구조적 문제 3가지

  • 커넥션이 연결될 때마다 프로세스 생성해 메모리 부족
  • 프로세스 리소스 양이 많아 무거운 프로그램이 되었음
  • 많은 커넥션 요청이 들어오면 컨텍스트 스위칭을 많이 해 CPU 부하가 높아짐

수많은 동시 커넥션을 감당하기엔 아파치 서버의 구조가 적합하지 않았고, 2004년에 아파치 서버를 보완하기 위한 소프트웨어, Nginx가 나왔다.

Nginx 동작 방식

Nginx는 하나의 Master Process와 다수의 Worker Process로 구성되어 실행된다.
Master Process에서는 설정 파일을 읽고 유효성을 검사하며, Worker Process를 관리한다. Worker Process에서는 요청을 처리하고, Worker Process의 개수는 설정 파일에서 정의되며, 정의된 프로세스의 개수와 사용 가능한 CPU 숫자에 맞게 자동으로 조정된다.

이렇게 Nginx는 프로세스를 효율적으로 활용함으로써 서버 자원을 최대한 활용하고, Event Driven을 활용한 비동기 Non-Blocking 방식으로 프로세스 작업이 끝날 때까지 대기하지 않아도 된다.

Non-Blocking?
: 앞의 프로세스가 작업을 수행중이더라도, 다음 프로세스는 기다리면서 다른 작업을 할 수 있는 방식

Nginx 동작 과정

  • 해당 스레드 풀 내에 한정된 자원만을 가지고 HTTP 요청에 대한 작업을 처리한다.
  • 요청에 대한 응답은 Nginx 내부에서 실행되고 있는 Worker Process에서 진행된다. Worker Process는 개발자가 따로 설정하지 않았다면 CPU에 맞게 자동으로 Worker Process가 생성된다.
  • Nginx는 Event Driven, 비동기 처리 방식의 특성을 가지는데, Event Driven은 Event Loop 기반으로 요청에 대한 작업을 처리한다. (Event Loop에서 작업이 처리될 때 비동기 방식으로 작업이 돌아간다.)
  • Nginx Event Driven 내에서 Event Handler에서 작업을 마치게 되면 완료된 순서대로 Queue에 쌓이고, Event Loop을 돌면서 Queue에 완료된 작업이 있는지 체크하면서 CPU가 IDLE한 상태가 없도록 활동한다.
  • Queue에 있는 완료된 작업을 받아 클라이언트에 응답(Response)한다.

0개의 댓글