nginx란?

이호용·2021년 1월 15일
0

42_ft_server

목록 보기
3/6

nginx란?

러시아의 프로그래머, 이고르 시쇼브가 하나의 웹 서버에 10,000개의 클라이언트의 접속을 동시에 다룰수 있는 기술적인 문제(apachedml c10k problem)를 해결하기 위해 만든 Event-driven구조의 http, Reverser Proxy, IMAP/POP PROXY server를 제공하는 오픈 소스 프로그램.

더 적은 자원으로 더 빠르게 서비스 하도록 함.

비동기 이벤트란: 하나의 프로세스로 여러개의 명령을 처리.

지금까지 대부부의 애플리케이션은 동기식(blockin I/O)1
를 사용하였다. 하지만 서버에서는 여러 요청을 동시에 처리해야했는데, 이 때문에 멀티쓰레드2를 사용할수 밖에 없었음. 개발자에게 직관적이고, 멀티 태스킹을 위해서는 어쩔 수 없는 선택이었음 그러나, 네트워크에서 대규모 요청을 동시에 처리하기에는 멀티쓰레드도 역부족. 이를 해결하게 비동기식 이벤트다.

blocking: 작업을 요청하면 일단 요청한 쪽은 일단 block이 되고, 작업이 완료가 된후에 응답을 받을수 있음. 작업이 완료가 되기 전에는 요청한 쪽은 block이 되어 다른 작업을 수행하지 못함.

이를 해결하기 위해 nginx에서는 싱글쓰레드와 이벤트기반의 비동처리를 사용함.

이벤트 루프가 계속 돌면서 작업을 요청 받고, 그 요청 받은 작업을 콜백함수에 쌓음. 콜백함수에선 순서대로 작업을 실행. 대신 I/O 작업이 종료되면 이벤트를 발생시키고, 이 이벤트는 해당 프로세스의 이벤트큐에 등록됨. 노드로 개발된 프로세스는 이 이벤트 큐에 등록된 새로운 이벤트를 감지하여, 해당 이벤트 시 수행해야할 작업 실행.


apache

MPM 방식으로 HTTP 요청을 처리합니다
mpm 은 크게 두가지로 나뉘어진다. (PreFork 방식, Worker 방식)

  • PreFork MPM (다중 프로세스)
    - 아파치는 요청(ex 사용자 접속) 하나 당 프로세스(또는 쓰레드) 하나가 처리하는 구조입니다. 고로 여러 요청이 발생되면 메모리 낭비가 심해지는 문제를 가지고 있습니다.
    - 이 방식은 Apache 설치시 default 로 설정되어 있습니다.
    - 스레드간 메모리 공유를 하지 않습니다. 이 방식은 독립적이기에 안정적인 반면, 메모리 소모가 크다는 단점이 있습니다.
    - 또한 프로세스에서 Apache 서버의 프로세스가 블록킹( blocking )이 되면 요청을 처리하지 못하고 완료될떄까지 대기해야하는 문제가 발생할수도 있습니다.
  • Worker MPM (멀티 프로세스-스레드)
    - Prefork 보다 메모리 사용량이 적고 동시접속자가 많은 사이트에 적합합니다. 각 프로세스의 스레드를 생성해 처리하는 구조입니다.
    - 스레드 간의 메모리 공유가 가능합니다.
    - 프로세스 당 최대 64개의 스레드처리가 가능하며, 각 스레드는 하나의 연결만을 부여받습니다.

https://whatisthenext.tistory.com/123

여기 사이트 이미지 참조 하면 이해 쉬움.

nginx

  • nginx의 경우 요청(사용자 입장)마다 프로세서를 복제하지 않는다.
  • 입장한 사용자가 이벤트를 발생시켯을 때, 프로세스에 작업을 올리고 해당 작업을처리하는 식으로 진행된다.
  • 일반적으로 NGINX는 연결에서 발생하는 모든 이벤트에 대한 정보를 커널에서 수신 한 다음 수행 할 작업에 대해 운영 체제에 명령을 제공하는 컨트롤러 인 이벤트 처리기입니다.
  • NGINX는 여러 이벤트를 수신 한 다음 하나씩 처리하여 필요한 작업을 수행합니다. 따라서 모든 처리는 한 스레드의 대기열에 대한 간단한 루프에서 수행됩니다. NGINX는 대기열에서 이벤트를 빼낸 다음 소켓을 쓰거나 읽는 등의 방식으로 반응합니다. 대부분의 경우 이는 매우 빠르며 (아마도 메모리에 일부 데이터를 복사하는 데 몇 개의 CPU 주기만 필요함) NGINX는 대기열의 모든 이벤트를 즉시 처리합니다.

    요약하면, nginx는 하나의 프로세스를 사용하고 이벤트가 발생할 때만 해당 이벤트를 처리하기 때문에 프로세스를 생성하는 작업 또는 최소한의 필요한 이벤트 작업만 진행한다. 고로 apache보다 여러 요청이 들어왔을떄 좀더 여유있게 작업을 진행할수 있다.
    nginx 추가 설명

1blockin I/O : 하나의 프로세스가 어떤 자원을 사용하고자 할떄 그 자원을 다른 프로세스가 점유하고 있다면, 그 프로세스가 그 자원을 마칠떄 까지 기다려야함. (싱글 쓰레드와 비슷한 개념)

2
멀티쓰레드 : 여러개의 쓰레드를 의미하며, 멀티쓰레드는 특정 쓰레드가 끝날떄까지 기다리지 않고, 한 쓰레드가 일정 시간만 cpu를 사용 할수 있도록 할수도 있음.

멀티쓰레드 단점 : 문맥전환 비용발생. 하나의 쓰레드 작업을 하다 다른 작업으로 넘어갈때 현재 진행중이던 작업을 저장을 하는 연산이 필요. 쓰레드를 시간별로 분배할떄도 자원 필요. 쓰레드가 많아질수록 비용이 커짐.

0개의 댓글