[NginX] NginX 개념 #1

Nginx란?

트래픽이 많은 웹사이트의 서버(WAS)를 도와주는 비동기 이벤트 기반의 경량화 웹 서버 프로그램.

Web Server로 활용되기도 하고, Reverse Proxy Server로 활용하여 WAS의 부하를 줄일 수 있는 로드밸런서 역할을 하기도 한다.

NginX는 Apache 서버의 단점을 보완하기 위해 만들어졌다.


Apache Server란?

Apache 서버는 커넥션 요청이 들어올 때마다 새로운 프로세스를 생성하여 커넥션을 유지하는 방식을 사용한다.

프로세스를 생성하는 것이 오버헤드가 크기 때문에 Prefork MPM 방식과, Worker MPM 방식을 주로 사용한다.

모듈 기반이기 때문에 모듈 추가, 제거가 편리하며 확장성이 좋다.

Prefork MPM (Multi Processing Module)

1. 프로세스를 미리 만들어놓고 커넥션 요청이 들어오면 미리 만들어 놓은 프로세스를 연결하는 방식.

(이미 만들어둔 프로세스가 모두 사용 중이라면 추가로 만들어서 연결한다.)

2. 프로세스와 커넥션이 1대1로 연결되며, 하나의 프로세스에 문제가 생겨도 다른 프로세스의 커넥션에는 문제가 생기지 않는다.

3. 프로세스가 많이 늘어나게 되면 메모리 사용률이 높아지게 되는 문제가 발생한다.

Woker MPM

1. 각 커넥션 요청 마다 스레드를 생성한다. (메모리 사용률이 낮아진다.)

2. 스레드 방식은 CPU 스케줄링을 위한 context swith에 많은 리소스를 사용하여 CPU 사용률이 높아진다는 문제가 발생한다.

 

아파치 서버의 문제점

점점 트래픽 양이 많아지면서 동시에 연결된 커넥션이 많아지면 위에서 설명한 메모리와 CPU의 소모가 커지기 때문에 더 이상 커넥션을 생성할 수 없는 문제 발생가 발생한다. (C10K = 커넥션 만개의 문제)


NginX가 아파치 서버의 문제점인 동시성 문제를 어떻게 해결하는가?

NginX가 아파치 서버 앞단에서 커넥션들을 관리하고 요청을 처리해준다.

이렇게 되면, NginX도 정적파일에 대한 요청처리가 가능하기 때문에 아파치 서버는 로직 처리에 집중할 수 있게된다.

 

NginX의 요청 처리 방식

  • NginX에는 마스터 프로세스워커 프로세스가 있는데 마스터 프로세스가 워커 프로세스를 생성해서 워커 프로세스가 커넥션을 형성하고 요청을 처리한다. 일반적으로 워커 프로세스는 CPU의 코어 수 만큼 생성한다.
  • 워커 프로세스는 형성된 커넥션이 아무런 요청을 하지 않는다면 커넥션을 삭제하고, 새로운 커넥션을 생성하거나, 이미 만들어진 커넥션으로부터 요청을 처리한다. 이러한 커넥션 생성, 삭제를 이벤트라고 한다.
  • 이벤트들은 OS의 커널이 큐 형식으로 워커 프로세스에게 전달해준다. 이벤트는 큐에 담긴 상태에서 워커 프로세스에 의해 처리될 때까지 비동기 상태로 대기하게 되며, 워커 프로세스는 단일 스레드 방식으로 하나의 스레드에서 이벤트를 처리한다.
  • 이벤트 처리는 단일 스레드에서 처리되지만, 클라이언트가 보낸 요청의 처리는 다른 스레드에서 처리된다.

 

NginX의 장점

  • NginX는 워커 프로세스를 CPU의 코어 개수 만큼 생성하므로 프로세스를 전환하는 컨텍스트 스위칭을 줄여서 CPU 사용률이 낮다.
  • 사용하는 프로세스가 적어 아파치 보다 훨씬 가볍다.
  • 사용하지 않는 커넥션을 삭제하고 다음 커넥션을 형성하여 프로세스가 쉬지않고 계속 일하기 때문에 메모리 사용률이 낮고, 리소스를 효율적으로 사용할 수 있다.
  • NginX의 설정을 동적으로 바꿀 수 있다.
    • NginX가 설정을 변경하면 기존의 프로세스 수 만큼 새로운 워커 프로세스를 생성하고 이후 들어오는 이벤트 할당을 새로운 워커 프로세스가 처리한다. (NginX가 이벤트 기반이기 때문에 가능)
    • 기존의 워커 프로세스는 연결된 커넥션의 요청과 이벤트 처리를 끝내고 나면 삭제된다.
    • 운영하는 프로세스의 수가 적기 때문에 동적 변경이 가능하다
    • NginX가 아파치 서버 앞단에 위치하기 때문에 NginX의 설정을 변경 후 워커 프로세스를 종료했다가 다시 시작하는 방법을 사용하면 연결된 커넥션과 대기 중인 이벤트들이 모두 죽어버려 아파치 서버로 요청을 보낼 수 없다. 따라서 동적 변경이 필요하다.

NginX의 단점

  • 워커 프로세스가 비정상 적으로 종료하는 상황이 생기면 관리하고 있던 커넥션과 관련된 요청을 더 이상 처리할 수 없다는 단점이 있다.

 

NginX가 이렇게 좋은데 아파치를 왜 쓰는가?

  • 아파치는 오랜 기간 동안 사용되어 와서 안정성과 신뢰성 측면에서 검증이 되어있고, 자료가 많다.
  • 다양한 모듈과 플러그인이 존재한다.
  • 모듈 방식이기 때문에 확장성이 좋다.
  • 다양한 플랫폼과 운영체제에서 안정적이다.

 

결론

NginX는 수많은 동시 요청 처리를 할 수 있고, 프로세스를 적게 만들어서 가볍기 때문에 안정적이고 다양한 기능을 제공하는 Apach 서버와 함께 쓰인다.


 

Reference

Nginx

Nginx template