러시아의 프로그래머, 이고르 시쇼브가 하나의 웹 서버에 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 작업이 종료되면 이벤트를 발생시키고, 이 이벤트는 해당 프로세스의 이벤트큐에 등록됨. 노드로 개발된 프로세스는 이 이벤트 큐에 등록된 새로운 이벤트를 감지하여, 해당 이벤트 시 수행해야할 작업 실행.
MPM 방식으로 HTTP 요청을 처리합니다
mpm 은 크게 두가지로 나뉘어진다. (PreFork 방식, Worker 방식)
https://whatisthenext.tistory.com/123
여기 사이트 이미지 참조 하면 이해 쉬움.
요약하면, nginx는 하나의 프로세스를 사용하고 이벤트가 발생할 때만 해당 이벤트를 처리하기 때문에 프로세스를 생성하는 작업 또는 최소한의 필요한 이벤트 작업만 진행한다. 고로 apache보다 여러 요청이 들어왔을떄 좀더 여유있게 작업을 진행할수 있다.
nginx 추가 설명
1blockin I/O : 하나의 프로세스가 어떤 자원을 사용하고자 할떄 그 자원을 다른 프로세스가 점유하고 있다면, 그 프로세스가 그 자원을 마칠떄 까지 기다려야함. (싱글 쓰레드와 비슷한 개념)
2
멀티쓰레드 : 여러개의 쓰레드를 의미하며, 멀티쓰레드는 특정 쓰레드가 끝날떄까지 기다리지 않고, 한 쓰레드가 일정 시간만 cpu를 사용 할수 있도록 할수도 있음.
멀티쓰레드 단점 : 문맥전환 비용발생. 하나의 쓰레드 작업을 하다 다른 작업으로 넘어갈때 현재 진행중이던 작업을 저장을 하는 연산이 필요. 쓰레드를 시간별로 분배할떄도 자원 필요. 쓰레드가 많아질수록 비용이 커짐.