Nginx는 왜 등장했을까? Apache 구조의 한계와 이벤트 기반 웹 서버 이해하기

2026. 6. 26. 18:56·Back-end/DevOps

이번 프로젝트에서 Nginx를 쓰게 되었고 본격적인 프로젝트를 시작하기 전에 왜 Nginx를 사용하는지 정리해보려고 한다

"웹 서버는 대부분 Apache나 Nginx를 사용한다. 그 이유가 뭘까?"

Nginx 소개

  • Nginx는 고성능의 오픈 소스 웹 서버 소프트웨어로 많은 웹 서버와 리버스 프록시로 널리 사용
  1. 가볍고 확장 가능한 구조와 높은 처리량이 특징
  • 가상 호스팅, 로드 밸런싱, SSL/TLS 암호화, URL 리다이렉션 등 다양한 기능을 제공

Nginx 란?

Nginx는 다목적 비동기 웹 서버 소프트웨어로, 많은 웹 서버와 리버스 프록시로 널리 사용된다. 주요 목적은 클라이언트 요청을 받아 정적 및 동적 콘텐츠를 처리하여 웹 서비스를 제공하는 것

  • 이를 통해 웹 서버의 응답 시간과 처리량을 향상 시킬 수 있다.

웹서버의 역할뿐만 아니라 프록시 서버, 캐싱, 분산 처리, 미디어 스트리밍 등을 위한 다양한 기능을 제공하며 기능뿐만 아니라 성능면에서 기존의 웹서버들보다 뛰어나 현재 NGINX는 가장 널리 사용되고 있는 웹서버이다.


Nginx 탄생 이유

Apache 작동 방식

NCSA HTTPd의 불편함을 해결하기 위해 Apache Server라는 게 등장한다. Apache Server는 요청이 들어오는 경우 connection을 생성한다. 그래서 새로운 클라이언트의 요청이 올 때마다 새로운 process를 생성한다.

 

 

그런데 process를 생성하는 경우 시간이 오래걸린다. 이를 해결하기 위해 Apache에서는 PREFORK방식을 이용했다. 그래서 새로운 클라이언트의 요청이 오면 미리 만들어 놓은 프로세스를 할당했다.

  • 만약 만들어 놓은 프로세스가 없는 경우 추가로 Process를 생성
  • 요청마다 독립적인 메모리 공간을 사용하기 때문에 안정적
    • 하지만 요청 수가 많아질수록 메모리에 부하가 발생하는 단점이 있음

이러한 구조 덕분에 개발자들은 다양한 모듈을 만들어 서버에 빠르게 기능을 추가할 수 있었다. 즉, 확장성이 높았고, Apache Server는 동적 컨텐츠를 처리할 수 있게 되었다. 확장성이 좋다는 장점은 결국 요청을 받고 응답을 처리하는 과정을 하나의 서버에서 해결하기 좋았다.


Apache 구조의 한계와 Nginx가 등장한 배경

이렇게 좋은 점만 있어보이는 Apache Server가 대체된 이유는 1999년 이후 컴퓨터가 많이 보급됨에 따라 요청이 많아져서 서버에 동시에 연결된 connection이 많을 때 더 이상 새로운 connection을 생성하지 못 하게 되었다.

이를 **C10K(connection 10000 problem)**문제라고 부른다. connection 10000개의 문제라는 뜻이며

Apache Server는 구조적으로 아래와 같은 문제점이 있다.

  • 메모리 부족: connection이 연결될 때마다 프로세스를 생성
  • 무거운 프로그램: 확장성이 좋다는건 곧 리소스가 않다는 걸 의미
  • CPU 부하 증가: 많은 connection 요청이 들어오면 context switching을 많이 하기에 CPU 부하가 증가

동시 접속이 급격히 증가하는 환경에서는 프로세스/스레드 기반 구조가 메모리 사용량과 context switching 측면에서 부담이 될 수 있었다. 이 문제를 해결하기 위해 이벤트 기반 구조를 가진 Nginx가 주목받기 시작했다.

초창기 Nginx는 Apache를 대체하기 위한 것이 아닌 보완 목적으로써 Apache Server가 지닌 구조적 문제점을 해결하기 위한 목적이였다.

사진에서 보는 것처럼 수많은 동시 connection을 Nginx가 유지하고, Nginx도 웹 서버이기에 정적 파일에 대한 요청은 스스로 처리하고, 클라이언트로부터 동적 파일의 요청을 받았을 때만 아파치 서버와 connection을 형성하여 아파치 서버의 부하를 줄였다.


Nginx 구조

master - worker 프로세스 모델을 사용한다.

master 프로세스는 설정 파일을 읽고, worker 프로세스를 생성하고 관리한다.

worker 프로세스는 실제로 클라이언트 요청을 처리하는 프로세스이다.

  • worker process가 만들어질 때 지정된 listen 소켓을 배정받는다.
  • 그 후 그 소켓에 새로운 클라이언트 요청이 온다면 connection을 형성하고 처리한다.
  • connection은 정해진 Keep-Alive 시간만큼 유지됩니다. 하지만 connection이 형성되었다고 해서 worker process가 해당 connection 하나만 담당하지는 않습니다
  • 형성된 connection으로부터 아무런 요청이 없다면 새로운 connection을 형성하거나 이미 만들어진 다른 connection 으로부터 들어온 요청을 처리한다.

Nginx에서는 이러한 connection 형성과 제거, 그리고 새로운 요청을 처리하는 것을 이벤트(event)라고한다.

이 이벤트들은 OS 커널이 Queue형식으로 worker process에 전달한다. 이 이벤트가 Queue에 있다면 비동기 상태로 유지가 된다. 그리고 worker process는 하나의 스레드로 이벤트를 꺼내서 처리해나간다. 이런 방식은 worker process가 쉬지 않고 일을 하기에, 요청이 없을 때 프로세스를 방치시키는 Apache Server보다 훨씬 효율적으로 자원을 사용할 수 있다.

위에 있는 이미지처럼 Apache 방식인 스레드 기반은 하나의 커넥션 당 하나의 스레드를 잡아먹지만 이벤트 기반 방식은 여러 개의 connection을 전부 Event Handler를 통해 비동기 방식으로 처리해 먼저 처리되는 것부터 로직이 진행되게끔 한다.

이러한 이벤트 구조가 바로 Nginx의 핵심

Nginx의 단점

  • 동적 컨텐츠를 기본적으로 처리 할 수 없음
  • 동적 콘텐츠에 대한 PHP 및 기타 요청을 처리하려면 NGINX가이를 실행하기 위해 외부 프로세서로 전달하고 렌더링 된 콘텐츠가 다시 전송 될 때까지 기다려야함(프로세스 속도 저하).
  • 즉, 동적 웹 페이지 컨텐츠를 가진 모든 요청을 위해 외부 자원과 연계(php-fpm)

Nginx의 장점

  • 이벤트 중심 접근 방식을 사용하여 클라이언트 요청 제공
  • 제한된 하드웨어 리소스로도 여러 클라이언트 요청을 동시에 효율적으로 처리
  • 단일 스레드를 통해 여러 연결을 처리 가능
  • 최소한의 리소스로 웹 서버의 아키텍처를 개선하기 위해 독립형 HTTP 서버로 배치 가능

참고 자료

https://dev-wisdom.tistory.com/234

https://soonmin.tistory.com/88

https://dkswnkk.tistory.com/513

https://www.youtube.com/watch?v=6FAwAXXj5N0

'Back-end > DevOps' 카테고리의 다른 글

[Docker] Docker 입문: 이미지, 컨테이너, Registry, Docker Engine 정리  (0) 2026.06.23
'Back-end/DevOps' 카테고리의 다른 글
  • [Docker] Docker 입문: 이미지, 컨테이너, Registry, Docker Engine 정리
dev_Hyeonjoon
dev_Hyeonjoon
스프링이랑 자바 공부 중 입니다!!
  • dev_Hyeonjoon
    Hyeonjoon's code
    dev_Hyeonjoon
  • 전체
    오늘
    어제
    • 분류 전체보기 (61)
      • CS (6)
        • Architecture (4)
        • Algorithm (2)
      • Front-end (10)
        • JavaScript (0)
        • React-project (5)
        • Vanilla[JS]-project (5)
        • study (0)
      • Tools (1)
        • GitHub (1)
        • AI (0)
      • Back-end (35)
        • Java (27)
        • Architecture (2)
        • JPA (0)
        • Trouble Shooting (1)
        • Spring (2)
        • DevOps (2)
      • Trouble Shooting (2)
        • Python (1)
      • 자격증 (1)
      • 알고리즘 (0)
      • 회고 (6)
        • 기타 (6)
        • 독서록 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    아키텍처
    Spring
    리액트
    자바
    코딩
    자바공부
    토이프로젝트
    파이썬
    vanillajs
    사지방코딩
    백엔드
    자바기초
    backend
    Java
    군대에서코딩
    OOP
    바닐라js
    Til
    형변환
    객체지향
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
dev_Hyeonjoon
Nginx는 왜 등장했을까? Apache 구조의 한계와 이벤트 기반 웹 서버 이해하기
상단으로

티스토리툴바