본문 바로가기

WS & WAS/nginx

Nginx 구조

Nginx 개요

 

기존 방식에서는 사용자 요청은 스레드 갯수로 따져가며 설계되다보니

많은 CPU, 메모리 자원이 활용되었다.

최근엔 동시접속자 수가 점점 늘어나고 있다보니 서버의 자원은 점점 느는데 서버는 이런 동시다발적 처리의 I/O작업을

견디지 못하고 죽어버리는데 이런 문제의 해결법으로 나온게 nGinx 였다.

 

블로킹 방식

멀티스레드로 사용하던 시절 블로킹 I/O 방식으로 처리가 되었다.

블로킹 방식은 I/O 작업이 끝날때까지 기다려야한다.

이런 작업들은 동시다발적으로 들어오는 작업에 부적합하다.

 

Non Blocking 방식

 

그래서 Nginx가 선택한 방법은 Non-blocking 방식이다.

이 방식은 작업을 수행하고 있더라도 프로세스는 기다리면서 다른작업을 할수가있다.

 

Nginx 는 스레드 풀에 스레드를 먼저 생성하고 스레드 풀 자원만 이용해서 HTTP 요청을 처리한다.

작업 큐로 대기열을 만들고 대기열에 쌓인 데이터를 처리할 여러 스레드로 구성이 된다.

 

워커 프로세스가 작업 큐에 작업을 넣게되면 대기열에서 작업을 가져오고 사용가능한 스레드에서 처리를 하게 한다.

 

 

Nginx 는 Master Process와 Worker Process 가 생성되면서 동작하게 된다.

worker_processes auto; 를 설정해두면 자동으로 갯수가 설정된다.

 

 

Event-driven

 

 

Nginx 는 Event Driven 특성을 가지고 있어서

Event Loop 기반으로 요청에대한 작업을 처리한다.

비동기 방식으로 동작하기때문에 A작업을 B가 기다리지 않는다.

 

요청을 스레드가 직접 처리 하지 않고 이벤트 핸들러에 보내고

이벤트 핸들러에서는 스레드에 작업을 실행시키고 완료된 스레드가 쌓이게 된다.

큐에 완료된 스레드는 클라이언트에 응답하게 된다.

 

나중에 다시 정확히 보도록하겟음

 

 

 

https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/

 

Inside NGINX: Designed for Performance & Scalability

Take a deep dive inside NGINX and learn why NGINX is perfectly suited for applications and servers that require high performance and scalability

www.nginx.com

 

https://www.nginx.com/blog/thread-pools-boost-performance-9x/

 

Boosting NGINX Performance 9x with Thread Pools

Learn how the thread pool in NGINX 1.7.11 and NGINX Plus R7 boosts performance up to 9 times by offloading blocking operations from the worker process

www.nginx.com