기본적으로 이 방식을 이해하기 위해서는 Nginx의 프로세스 모델을 알 필요가 있다.
Nginx는 다음과 같이 master process, worker process 등으로 구성되어 있다.
다음 사진은 AWS EC2의 프리티어 서버를 개설하고 nginx를 설치한 후 실행중인 프로세스를 조회한 것이다.
사진에서 보면 worker process가 1개인 것을 볼 수 있는데 보통 CPU의 코어 개수와 worker process의 개수가 동일하다. (프리티어 코어 개수는 1개)
각 프로세스가 하는 일은 다음과 같이 정리할 수 있다.
worker process는 생성될 때 listen socket들을 할당받고 event(새로운 connection 생성)를 기다리게 된다.
Chess | Blocking |
---|---|
대전 상대가 나타날 때까지 기다린다. | listen socket에 새로운 연결 요청이 올 때까지 기다린다. (event를 기다린다.) |
대전 상대가 나타나 게임을 받아들인다. | 소켓에 새로운 연결 요청이 나타나면 연결을 받아들인다. |
게임이 시작되고, 말을 움직이고 상대방이 둘 때까지 기다린다. | client의 응답(response)이 올 때까지 기다린다. |
게임이 끝나면, 다시 게임을 진행할건지 보기 위해 기다린다. | webserver는 연결의 keep-alive 시간만큼 기다린다. |
만약 시간이 너무 지나거나 상대방이 안한다고 하면, 새로운 상대방을 기다린다. | 연결이 종료될 때(클라이언트가 연결을 종료하거나 타임아웃될 때), 웹 서버 프로세스는 새로운 연결 listening을 진행한다. |
- 이번 체스 게임은 여러 명과 동시에 진행하는 경우이다.
- 엄청난 체스의 마스터라 한번 두고 옆의 테이블로 이동할 수 있다.
Chess | Non-Blocking |
---|---|
대전 상대가 나타날 때까지 기다린다. | listen socket에 새로운 연결 요청이 올 때까지 기다린다. (event를 기다린다.) |
대전 상대가 나타나 새로운 게임을 시작한다. | listen socket에 event가 발생하여 worker process가 새로운 connection socket 생성 |
상대가 말을 움직인다. | connection socket에 event 발생 |
상대방이 움직인 것에 대응하여 나도 말을 움직인다. | connection socket에 event 발생에 따라 대응한다. |
https://www.nginx.com/resources/glossary/nginx/
https://kanoos-stu.tistory.com/entry/Nginx
https://manhyuk.github.io/c10k-problem/
https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/