Apache vs Nginx

SummerToday·2024년 2월 29일

도커, 서버 기술

목록 보기
22/34
post-thumbnail

Apache

아파치는 아파치 재단에서 만든 오픈 소스 프로젝트 형식의 가장 유명한 웹서버이다.
다양한 운영체제에서 사용될 수 있고, 주로 리눅스와 윈도우즈 운영체제에서 사용된다.

Apache 구동 방식

Apache는 Client 요청을 받을 시 MPM(Multi Processing Module : 다중처리모듈)이라는 방식으로 요청을 처리하며, 대표적으로 Prefork와 Worker방식이 존재한다.

  • Prefork MPM (Multy Processing Module) - 안정성 우선

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

    • 새로운 HTTP 요청이 올 때마다 프로세스를 생성하여 각 프로세스에서 해당 요청을 처리한다.

    • 프로세스를 생성하는 시간이 오래 걸리다 보니, 미리 만들어놓은 프로세스를 할당하는 방식인 Prefork 방식을 사용한다.

    • 단일 스레드 방식으로 작동하여, 하나의 프로세스당 하나의 작업만 처리할 수 있다.

    • 커넥션이 많아지면 많아질수록 프로세스의 수가 많아져 메모리 부족 현상, CPU 과부하 같은 문제들이 발생하여 커넥션을 더이상 생성하지 못하는 문제가 발생한다. (C10K 문제)

      • C10K 문제
        동시 커넥션 수가 10,000단위가 넘어가는 순간 서버는 더이상 커넥션을 형성하지 못하는 문제.

  • Worker MPM(Multy Processing Module) - 성능 향상 우선

    출처 : https://old.zope.dev/Members/ike/Apache2/osx/configure_html

    • 하나의 프로세스 내에서 여러 스레드를 생성하여, 여러 HTTP 요청을 처리할 수 있다.

    • 쓰레드를 사용하기 때문에 쓰레드간의 메모리를 공유하며 Prefork 방식보다 메모리 소모가 적다.

    • 하지만 이 방법도 커넥션이 많아질수록 프로세스와 스레드의 수가 많아져 메모리 부족현상, CPU 과부하 같은 문제들을 근본적으로 해결할 수는 없었다.


Nginx

기존 아파치 서버의 구조적 한계로 인한 동시접속 문제를 해결하기 위해 나타난 웹 서버이다.
하지만 아파치 서버를 완전히 대체할 목적으로 만들어지지는 않았고, 함께 사용하기 위해 만들어졌다.

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


Nginx 구성

Ngin는 하나의 Master Process와 N개(보통은 cpu의 코어 개수)의 고정된 Worker Process로 구성되어 있는 Event 기반 구조를 가지고 있다.

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

Master Process의 주 역할은 설정 파일을 읽거나 검증하며 Worker Process를 관리하는 역할을 수행하고, Worker Process는 요청에 대한 실질적인 처리를 수행한다.


Nginx 구동 방식

Nginx는 비동기 이벤트 기반 모델을 통해서 Worker Process 간에 요청을 효율적으로 분산하고, Event Driven 방식으로 동작한다.

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

  • 이벤트들을 OS 커널이 큐 형식으로 워커 프로세스에게 전달 해준다.

  • 이벤트들은 워커 프로세스가 해당 이벤트를 처리할 때까지 큐에 담긴 상태로 비동기 방식으로 대기하게 된다.

  • 워커 프로세스들은 하나의 스레드로 이벤트를 꺼내서 처리하게 된다.

  • 워커 프로세스는 Disk I/O 작업 같은 시간이 오래 걸리는 작업은 Thread Pool 이라는 곳에 해당 이벤트를 위임하여 따로 수행하게 하고, 큐 안의 다른 이벤트들을 처리하러 간다.

Nginx 장점

  • 요청이 들어올 때마다 프로세스와 스레드를 생성하는 대신 고정된 프로세스와 스레드를 사용하여 메모리 부족과 CPU 과부하 문제를 해결할 수 있다.

  • 동시 커넥션 양 최소 10배 증가 (일반적으로 100 ~ 1000배 증가)

  • 동일한 커넥션 수일 때 속도 2배 향상

  • Nginx의 설정을 개발자가 동적으로 변경할 수 있다. (ex. nginx.conf 파일을 통해서 Worker Process의 수를 조절 등)


Nginx 단점

  • 개발자가 기능 추가를 시도하다가 실행중인 워커 프로세스를 중지 시킬 수 있기 때문에, 개발자가 직접 모듈을 만들어 확장하기가 까다롭다.

Nginx 주요 활용

  • 웹 서버 가속기 역할 수행

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


  • SSL 터미네이션 역할 수행
    SSL 터미네이션은 클라이언트와는 https 통신을, 서버와는 http 통신을 하는 것을 의미한다.
    보통 Nginx와 서버는 같은 네트워크 안에서 작동되기 때문에 보안 통신을 하지 않아도 보안에 큰 위험이 생기지 않는다.

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


  • 캐싱
    Nginx는 http 프로토콜을 사용하여 전달하는 컨텐츠를 캐싱할 수 있다. 한번 서버로부터 받은 응답을 보관하고 있다가 클라이언트에게 전달하게 된다.
    캐싱을 하는 경우에는 Nginx를 클라이언트 네트워크와 근접하게 위치시킨다.

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


Apache vs Nginx

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


참고 : Nginx 설정 템플릿 링크

https://github.com/h5bp/server-configs-nginx




추가 참고 :
https://junghyungil.tistory.com/118
https://www.youtube.com/watch?v=6FAwAXXj5N0
https://willseungh0.tistory.com/137

profile
블로그 이관했습니다.

0개의 댓글