Web Server

웹서버 개요 이론 :: Apach 아파치 vs Nginx 엔진엑스

gamjadori 2024. 1. 27. 15:13
728x90

Apache

  • 거의 모든 OS에서 실행되고, 다른 유명한 소프트웨어 프로젝트와의 문서화가 잘 되어 있고 통합 지원 등이 이점
  • 클라이언트 요청 당 하나의 스레드가 처리하는 구조로, 사용자가 많으면 스레드 생성, 메모리 및 CPU 낭비
  • 특징: 동적 콘텐츠 처리, 다양한 모듈, 스레드 / 프로세스 기반 구조
    • 스레드: 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위
  • 웹서버는 MPM(Multi-Processing Modules, 다중 처리 모듈)을 사용하여 클라이언트로부터 받은 요청을 처리
  • 아파치 HTTP 서버
    • 하나의 자식 프로세스 당 하나의 스레드를 갖는 구조 (자식 프로세스 최대 1024개)
    • 스레드 간 메모리 공유 하지 않음
    • 독립적이기에 안정적인 반면, 메모리 소모가 큼
    • 실행 중인 프로세스를 복제해 실행 (메모리 영역까지 복제)
    • 응답 프로세스를 미리 띄워 놓고 클라이언트 요청 시, 자식 프로세스가 반응하는 방식
    • 디버깅이 빈약한 플랫폼에서 쉬운 디버깅 가능
    • 일반적으로 Single CPU 또는 Dual CPU에서 성능이 좋음
  • MPM 방식: PreFork / Worker
    1. PreFork MPM (다중 프로세스)
      1. 클라이언트 요청에 대해 아파치 자식 프로세스를 생성해 처리
      2. 요청이 많을 경우, 프로세스를 생성해 처리
      3. 아파치 설치 시 기본으로 설정
      4. 아파치 HTTP 서버
        • 하나의 자식 프로세스 당 하나의 스레드를 갖는 구조 (자식 프로세스 최대 1024개)
        • 스레드 간 메모리 공유 하지 않음
        • 독립적이기에 안정적인 반면, 메모리 소모가 큼
        • 실행 중인 프로세스를 복제해 실행 (메모리 영역까지 복제)
        • 응답 프로세스를 미리 띄워 놓고 클라이언트 요청 시, 자식 프로세스가 반응하는 방식
        • 디버깅이 빈약한 플랫폼에서 쉬운 디버깅 가능
        • 일반적으로 Single CPU 또는 Dual CPU에서 성능이 좋음
        • ** CPU (중앙 처리 장치): 컴퓨터 시스템을 통제하고 프로그램의 연산을 실행 · 처리하는 가장 핵심적인 컴퓨터의 제어 장치
    2. Worker MPM (멀티 프로세스-스레드)
      1. PreFork보다 메모리 사용량이 적고, 동시 접속자가 많은 사이트에 적합
      2. 각 프로세스의 스레드를 생성해 처리하는 구조
      3. 스레드 간의 메모리 공유 가능
      4. 아파치 HTTP 서버
        • 프로세스 당 최대 64개의 스레드 처리 가능 / 각 스레드는 하나의 연결만을 부여받음
        • 일반적으로 Multi CPU 시스템에서 성능이 좋음
        • 단점: 클라이언츠 접속 시, 프로세스 또는 스레드를 생성하는 구조이기에 대량의 클라이언트(1만 이상)가 동시 접속한다면 CPU/메모리 사용이 증가하고 프로세스/스레드 생성 비용이 드는 등, 요청에 한계 존재

Nginx

  • 아파치의 C10K 문제점 해결을 위해 만들어진 Event-Driven 구조의 웹 서버 소프트웨어** C10K: (1만 개의 클라이언트 문제) 한 시스템에 동시 접속자 수가 1만 명이 넘어갈 때 효율적 방안

>> 프로그램의 흐름이 이벤트에 의해 결정되는 방식

  • 특징: Event-Driven 처리 기반 구조
    • 한 개 또는 고정된 프로세스만 생성하고, 여러 개의 커넥션을 모두 Event-Handler를 통해 비동기 방식으로 처리
    • 적은 양의 스레드만 사용되기 때문에 Context Swiching 비용이 적고, CPU 소모가 적음Context: 스레드가 작업을 진행하는 동안 작업정보(레지스터, 커널스택, 사용자스택) 보관스레드의 개수가 많아질수록 Context Swiching 작업은 더 빈번하게 일어나고, 이 때문에 성능 저하
    • OS가 A작업을 진행할 때, A스레드의 Context를 읽어오며, B스레드로 전환할 때 A스레드의 Context를 저장하고 B스레드의 Context응 읽어오는 일련의 반복을 수행
    • ** Context Swiching
  • 동시 접속자 수가 많아져도 추가적인 생성 비용이 들지 않음
  • CPU와 관계없이 모든 I/O들을 전부 Event Listner로 미루기 때문에 흐름이 끊기지 않고 응답이 빠르게 진행되어 1개의 프로세스로 더 빠른 작업 가능 > 메모리를 적게 사용
  • 리버스 프록시로 배치 가능: Nginx의 빠른 처리 속도를 활용하여 클라이언트의 모든 요청을 처리
  • ** 리버스 프록시: 클라이언트와 웹 서버 간의 중개자 역할을 하는 서버로, 클라이언트로부터의 요청을 대신 받아 웹 서버에 전달하고, 웹 서버의 응답을 클라이언트에게 전달하는 역할
  • 단점
    1. 동적 콘텐츠 처리 불가능
    2. 외부 프로세서로 전달하고 렌더링된 콘텐츠를 다시 전송할 때까지 기다려야 함 (프로세스 속도 저하)
    3. 아파치에 비해 다양한 모듈이 없음