ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nginx 작동 원리
    CS 지식/기타 2021. 1. 15. 14:33
    반응형

    Nginx

    • apache의 한 시스템에 동시 접속자 수가 1만명이 넘어갈 때, 효율적이지 못한 문제를 해결하기 위해 나온 Event-Driven 구조의 웹 서버 SW

    • 가벼움과 높은 성능을 목표로 탄생

    • 웹 서버, 리버스 프록시, 메일 프록시

      • 리버스 프록시

        • 컴퓨터 네트워크에서 클라이언트를 대신해서 한 대 이상의 서버로부터 자원을 추출하는 프록시 서버의 일종

        • 자원들을 웹 서버 자체에 가지고 있는 것처럼 (origin 처럼) 클라이언트로 반환

        • 목적지에 직접 접근하지 않고 프록시를 통해 데이터를 주고 받는 포워드 프록시와 반대되는 개념으로, 리버스 프록시는 다른 서버의 정보를 프록시를 통해 받아오는 중간 매개체

        • 사용자가 요청하는 Endpoint는 접근하고자 하는 최종 목적지 서버가 아닌, 리버스 프록시

        • 리버스 프록시는 사용자의 Endpoint가 리버스 프록시의 Domain Name이 된다. 사용자는 항상 리버스 프록시의 주소인 reverse.proxy.com 과 같이 요청하게 되고, 리버스 프록시는 back-end 단에 있는 여러 서버들 중 하나로부터 응답을 받아와 사용자에게 반환

    Apache VS Nginx

    • Apache

      • Client가 HTTP 요청을 보낼 때, MPM(Multi Process Module)을 사용해서 처리한다.

      • MPM

        • PreFork (다중 프로세스 처리)

          • 요청에 대해 default 개수만큼 자식 프로세스를 생성해서 처리하고, 요청이 많을 경우 Process를 생성해서 처리하는 방식

        • Worker 방식(멀티프로세스 - 스레드)

          • Prefort와 같은 방법으로 자식 프로세스 생성하고, 요청이 많을 경우 각 프로세스의 스레드를 생성해서 처리하는 구조

      • 동시 접속 요청이 많아질수록 프로세스나 스레드 생성 비용이 들고, 대용량 요청에 대한 한계를 드러냄

    • Nginx

      • Event-Driven 방식으로 한개의 고정된 프로세스만 생성한다.

      • 요청에 대한 처리는 스레드에 의존하지 않고 프로세스 내부에서 비동기 방식으로 작업을 처리한다.

      • 동시 접속 요청이 많아도 프로세스나 스레드 생성 비용이 존재하지 않음

      • 문제점

        • Event 처리 시간이 길어져 단일 Thread를 점유하고 있으면, 다른 Event 처리도 늦어지는 Blocking 현상이 발생

        • 주로 Dist 동작이 동반되는 File Read/Write의 경우, 오랜 시간 스레드를 점유할 수 있는 Blocking의 주요 원인

        • Nginx third-party modules들의 처리 시간이 긴 함수도 원인이 될 수 있음

      • 이런 Blocking 문제를 해결하기 위해 Nginx의 Thread Pool 기법이 고안됨

     

    Nginx Thread pool

    • NGINX version 1.7.11 과 NGINX Plus Release 7 부터 Thread pool 방식이 도입

    • worker process가 긴 작업을 실행해야하는 경우, 직접 실행하지 않고 task queue에 작업을 넘긴다. task queue는 thread pool에서 작업을 수행할 수 있는 스레드에게 작업을 주고, 완료되면 다시 worker process에게 완료된 결과를 전달한다.

    • 엔진엑스 동작 원리
      • The worker process offloads blocking operations to the thread pool 라고 설명되어있다.

    • 이 기법을 활용하면, 하나의 worker thread가 Blocking 되어도 나머지 worker thread가 작동하는데 영향이 없기 때문에, Blocking 문제를 해결할 수 있다.

    • Worker process

     

     

    기타) Node.js에 Nginx를 둘 경우 이점

    Node.js의 앞단에 Nginx를 프록시서버로 두면, 버퍼 오버플로우의 취약점에 의한 공격을 어느정도 방지 가능

    • 버퍼 오버플로우

      • 메모리 공간을 벗어나는 경우 오버플로우가 되고, 사용되지 않아야할 영역에 데이터가 덮어씌워져서 주소, 값을 바꾸는 공격

      • 실제포트를 숨기고 nginx의 80포트를 통해서 프록시하면 보안적으로 막을 수 있다는 것

     

    Reference

    https://medium.com/sjk5766/%EB%84%8C-%EB%AD%90%EB%8B%88-nginx-9a8cae25e964

    https://ko.wikipedia.org/wiki/%EB%A6%AC%EB%B2%84%EC%8A%A4_%ED%94%84%EB%A1%9D%EC%8B%9C

    https://www.google.com/search?q=%EB%A6%AC%EB%B2%84%EC%8A%A4+%ED%94%84%EB%A1%9D%EC%8B%9C&oq=%EB%A6%AC%EB%B2%84%EC%8A%A4+%ED%94%84%EB%A1%9D%EC%8B%9C&aqs=chrome..69i57j0l7.1791j1j7&sourceid=chrome&ie=UTF-8

    https://ssup2.github.io/theory_analysis/Nginx_Thread_Pool/

    https://www.nginx.com/blog/thread-pools-boost-performance-9x/

    반응형

    'CS 지식 > 기타' 카테고리의 다른 글

    클라우드 컴퓨팅  (0) 2020.09.30

    댓글

Designed by Tistory.