-
Nginx 구조 알아보기Nginx 2023. 10. 7. 09:24728x90반응형
- 목차
관련된 글https://westlife0615.tistory.com/45
https://westlife0615.tistory.com/345
소개.
Nginx 는 대표적인 웹서버입니다.
웹서버란 HTML , 이미지 파일과 같은 웹 컨텐츠를 제공하는 서버를 의미하는데요.
Nginx 는 Apache 의 httpd, IIS 등과 같이 잘 알려진 웹서버입니다.
Nginx 는 Event-Driven 방식으로 다중 요청을 처리할 수 있는 웹서버로 유명합니다.
클라이언트의 동시간 다중 요청을 멀티 프로세스나 멀티 쓰레드 방식을 활용하여
물리력으로 해결하는 여타 웹서버와 다릅니다.
Nginx 는 Event Loop & Queue 를 활용하여 Event-Driven 방식으로 동원합니다.
이번 글에선 Nginx 의 구조와 네트워크 트래픽의 처리 방식에 대해서 자세히 알아보려고 합니다.
Master Process.
Nginx 는 Master Process 와 Client Process 로 구성됩니다.
Master Process 여타 분산 컴퓨팅 시스템의 Master Node 들처럼
Client Process 들을 케어하며 조율합니다.
Master Process 가 실질적인 Client 와 Connection 을 맺는 구성요소이구요.
Client 와의 TCP 커넥션을 책임집니다.
TCP Socket 프로그래밍에서 사용되는 System Call 과 관련지어 이야기하자면,
- Socket
- Bind
- Listen
단계를 책임집니다.
그 외의 Accept, Receive, Send 의 과정은 Worker Process 가 전담하는 구조이죠.
Master Process 는 nginx.conf 의 설정 정보를 토대로 전체 Nginx 구조를 세팅하구요.
Shared Memory IPC 기법을 통해서 설정 정보는 Worker Process 와 공유합니다.
그래서 요약하자면,
1. Master Process 는 80 또는 443 인 Http Port 을 리스닝하며 클라이언트와의 연결을 할 수 있습니다.
2. Master Process 는 Worker Process 를 관리합니다.
아래 코드 블록은 Worker Process 갯수 설정을 10개로 세팅한 Nginx 의 process list 입니다.
nginx.conf 의 worker_process : 10 으로 설정한 케이스입니다.
<처음 Process List>
UID PID PPID C STIME TTY TIME CMD root 1 0 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 70 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 72 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 74 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 76 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 78 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 79 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 81 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 83 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 84 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 86 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off;
<Worker Process 2개를 Kill 한 이후, 새로운 Worker Process 가 추가된 상태 >
Process ID 가 81, 83 인 Worker Process 를 강제로 종료시킨 후,
Process ID 가 604, 606 인 Worker Process 들이 자동으로 되살아납니다.
UID PID PPID C STIME TTY TIME CMD root 1 0 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 70 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 72 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 74 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 76 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 79 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 83 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 84 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 86 1 0 00:21 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; root 90 0 0 00:21 pts/0 00:00:00 /usr/bin/qemu-x86_64 /bin/bash /bin/bash root 103 0 0 00:22 pts/1 00:00:00 /usr/bin/qemu-x86_64 /bin/sh /bin/sh nginx 604 1 0 00:24 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off; nginx 606 1 0 00:24 ? 00:00:00 /usr/bin/qemu-x86_64 /usr/sbin/nginx nginx -g daemon off;
Shared Memory.
Shared Memory 는 IPC 의 한가지 기법으로
Nginx 의 Master Process 와 Worker Process 가 IPC 통신을 위해서 사용합니다.
Shared Memory 를 통해서 모든 Nginx Process 들은 Nginx 설정 정보를 공유합니다.
Shared Memory 는 Shared Memory Region 이라는 개별 저장공간들로 구성되는데요.
nginx.conf 에서 Shared Memory Region 의 Identifier 와 저장 공간의 크기를 설정할 수 있습니다.
<shm_name, shm_size 설정 예시>
shm_name my_nginx_shm; shm_size 128m;
https://westlife0615.tistory.com/345
Worker Process.
Worker Process 는 클라이언트의 요청을 처리하는 실질적인 구성요소입니다.
nginx.conf 의 worker_processes Directive 를 통해서 Worker Process 의 갯수를 설정할 수 있습니다.
그리고 보통은 CPU Core 갯수와 동일하게 맞춥니다.
Worker Process 는 Event-Driven 방식으로 Task 처리를 위해서 Event Queue 와 Event Loop 를 사용합니다.
Event Queue.
클라이언트와 TCP Connection 이 맺어진 이후에,
Worker Process 는 클라이언트의 요청을 Event Queue 에 저장합니다.
Event Queue 는 Worker Process 가 처리해야하는 이벤트들의 모음입니다.
Queue 자료구조를 사용하기 때문에 FIFO (First In First Out) 의 순서로 작업이 처리됩니다.
이벤트는 곧 클라이언트가 Nginx 로 보내온 요청들인데요.
HTTP, TCP 요청이 이에 해당합니다.
Worker Process 는 Event-Loop 을 돌며, Event Queue 에 쌓인 이벤트들을 하나씩 처리합니다.
이때, 하나의 Worker Process 는 이벤트는 동기적으로 (Synchronously) 처리하게 되는데요.
Nginx 는 Single Thread, Multi Process 모델로 하나의 Worker Process 는 동기적으로 작업이 수행됩니다.
다만, Multi Process 구조를 취하는 점이 다른 웹서버와의 차이점입니다.
따라서 효율적인 요청 처리를 위해서 Core 수와 worker_process 의 수를 비슷하게 유지하는 것이 중요합니다.
반응형'Nginx' 카테고리의 다른 글
[Nginx] Web Content Serving 알아보기 ( default.conf ) (0) 2024.03.18 Nginx HTTP Upstream 알아보기 (0) 2023.09.16