ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nginx 구조 알아보기
    Nginx 2023. 10. 7. 09:24
    728x90
    반응형


     

    - 목차

     

     


    관련된 글

    https://westlife0615.tistory.com/45

     

    TCP Socket 알아보기

    - 목차 소개. TPC 소켓에 대해서 가볍게 알아보는 시간을 가지려고 합니다. 소켓은 TPC 소켓과 같은 네트워크 통신 뿐만 아니라 IPC (Inter Process Communication) 에서도 Socket 방식의 통신 기법이 있는데요

    westlife0615.tistory.com

     

    https://westlife0615.tistory.com/345

     

    Shared memory communication 알아보기

    - 목차 관련된 글 https://westlife0615.tistory.com/347 IPC Signal 알아보기 - 목차 함께 보면 좋을 글 https://westlife0615.tistory.com/345 Shared memory communication 알아보기 - 목차 소개. IPC (Inter-Process Communication) 의 방

    westlife0615.tistory.com

     

    소개.

    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

     

    Shared memory communication 알아보기

    - 목차 관련된 글 https://westlife0615.tistory.com/347 IPC Signal 알아보기 - 목차 함께 보면 좋을 글 https://westlife0615.tistory.com/345 Shared memory communication 알아보기 - 목차 소개. IPC (Inter-Process Communication) 의 방

    westlife0615.tistory.com

     

    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
Designed by Tistory.