Nginx와 Apache

타미·2020년 10월 2일
5

우테코 팀 프로젝트에서 Nginx를 도입했다! Nginx가 웹서버로 좋다고 하는데 왜 그런지 Apache와 비교하며 좀 더 자세히 알아보자.

❓Web Server는 어떤 역할을 하나요?

  • Web Server : 정적 데이터 처리 ↔ WAS : 동적 데이터 처리

  • 우리 프로젝트에서는 Reverse Proxy 역할을 한다.

    • Proxy : 대신하다

    • Proxy Server : 클라이언트와 서버간의 중계 서버

      • 캐시, 보안 (SSL https 적용한 것), 트래픽 분산 (로드 밸런싱) 기능
    • Forward Proxy VS Reverse Proxy

      Forward Proxy와 Reverse Proxy 구분 기준은 위치!

      Client - Foward Proxy - Internet - Server

      Client - Internet - Reverse Proxy - Server

      • Reverse Proxy

        • WAS 앞에 붙어있을 때
      • Forward Proxy

        • 쉽게 말해 Client 단에 붙어있다고 생각하면 된다.
        • 서버 개발자는 관여하지 않는 위치이다.
        • (예) 클라이언트 (노트북)에서 설정할 수도 있다.
        • (예) Internet Service Provider에서 Forward Proxy 역할을 하기도 한다. (쉽게 말해 Wifi를 제공해주는 LG u+에서 캐싱을 해줄 수 있다는 의미이다.)

        제이미 테코톡

  • 💡 Web Server ≠ Reverse Proxy

    • 우리 프로젝트에서 Web Server는 Reverse Proxy 역할을 하는 것!
    • Reverse Proxy 역할을 하지 않는 Web Server도 있다.
    • (일반적인 경우는 아니지만) WAS에서 Reverse Proxy 역할을 수행 할 수도 있다.

❓Reverse Proxy를 도입했을 때의 이점이 있나요?

  • 기본적으로 Reverse Proxy 위치에서 도입할 수 있는 기술들이 곧 이점
    • 캐싱, 로드 밸런싱, 보안
  • Client에게 실제 서버 ip를 숨길 수 있다.
    • 보안적으로 안전
    • Client는 Reverse Proxy가 실제 Server라고 생각하고 접속하게 된다.
  • 우리 프로젝트에서 적용한 Reverse Proxy에서의 기능
    • 보안 (SSL, 실제 서버의 ip 숨기기 - redirect)
    • 캐싱 (to do)

Apache

요청마다 Thread or Process 생성

전략에 따라 Thread or Process 다르다.

MPM (Multi Process Module - Apache에서 요청하는 처리 전략)

  1. prefork
    • 자식 프로세스 - Single Thread
      • 하나의 요청이 하나의 프로세스를 차지한다.
      • 그 프로세스 안에는 하나의 Thread가 있다.
      • 여분의 Child Process를 미리 만들어서(prefork) 요청이 들어올 때 새로 만들지 않게 동작한다.
    • 높은 성능이 필요할 때 사용 (PHP)
    • 하나의 프로세스가 정지해도 다른 프로세스에게 영향을 주지 않는다.
  2. worker
    • 자식 프로세스 - Multi Thread
      • 하나의 요청이 하나의 Thread를 차지한다.
    • prefork에 비해 경량화된 것
      • 자원을 상대적으로 적게 사용한다. (Thread가 자식 프로세스의 자원을 공유하기 때문)
  3. event
    • Nginx와 유사한 Event Driven 전략
    • 나중에 추가된 전략

Apache의 한계

많은 요청을 처리하기 힘들다.

  • 요청마다 Thread or Process를 처리해야 하는데 자원은 한정적이다.
    • 메모리 ⬆️ (Thread or Process 가 차지하는 메모리)
    • CPU 사용량 ⬆️
    • 요청이 많아지면 성능이 저하된다. (속도가 느려진다.)

Nginx

Event Driven + 비동기 처리

요청 → Request Queue에 저장 (Event Loop) → 처리 (비동기)

Event Driven 구조

이벤트에 대한 반응으로 동작하는 구조 ↔ Apache

  • Event 생성자
    • Event 발행
  • Event 채널
  • Event 소비자

Event 생성자 ↔ Event 소비자 : 느슨한 결합 (서로 알 필요가 없다.)

(Nginx에서도 Event를 만드는 쪽과 실제 로직이 동작하는 쪽은 서로 알 필요가 없음)

Master Worker 구조

Nginx에 사용되는 프로세스에는 3가지 종류가 있다.

  • Master Process
    • config 파일을 읽고 worker process를 생성/관리
  • Worker Process
    • 실제 동작을 수행함
  • Helper Process
    • Cache Loader : 최초로 캐시를 로딩해줌
    • Cache Maanger : 주기적으로 캐시를 관리해줌

Nginx의 특징

  • 적은 양의 자원으로 많은 양의 트래픽을 처리할 수 있다.
    • 요청에 따라 추가적으로 자원을 사용하지 않기 때문에 많은 요청이 들어왔을 때 느려지지 않는다. ↔ Apache
      • 하지만 너무 많은 요청을 받으면 처리하지 못하는 것은 Apache와 마찬가지이다.
    • 비동기로 Context Switching이 적다.

❓Apache, Nginx를 각각 언제 사용할까?

Apache

  • process base
  • 매우 복잡한 CGI 처리, 동영상 데이터 전송, DB 처리 실행
    • 우리가 현재 알고 있는 Web Server는 정적 데이터 처리를 담당하고 있다.
    • 하지만 옛날에는 WAS 없이 Web Server에서 동적인 데이터를 처리한 적이 있다.
      • 요게 CGI 기술
      • JAVA Servlet이 활성화되지 않는 때
    • 즉 현대에 많이 사용하는 Web Server가 아니라 과거에 Web Server에서 복잡한 작업을 처리할 때 유리하게 만든 서버임!

Nginx

  • event base

  • Http Proxy에 적합하도록 Apache를 개선하여 만듦

  • 대량의 데이터를 처리할 때 유리하다.

    • Apache와 달리 많은 양의 요청이 들어와도 느려지지 않는다.
  • 가벼운 작업에 유리하다.

    • 가벼운 작업이란 DB, Network, Disk I/O (읽기/쓰기)를 하지 않는 작업을 의미한다.

      (예) await getSomthing(); // 서버와 Networking을 하는 작업, CPU에서 처리하지 않는다.

    • 작업에는 2가지 종류가 있다.

      • CPU Bound : CPU 자원을 사용하는 작업
      • I/O Bound : OS(커널) 내에 있는 시스템 호출 프로그램과 하드웨어 사이에서 실행되는 작업
      • Nginx에서 I/O 관련 처리 시간이 길어지면 결국 Request Queue에 작업 쌓여 성능이 저하될 수 있다.
  • 빠르게 끝나는 작업 + 많은 양의 트래픽을 다룰 때 Nginx가 더 적합하다.

    • 정적 데이터를 처리할 때 Nginx가 더 성능이 좋음
    • Reverse Proxy는 WAS 앞단에 있고 많은 양의 트래픽을 감당해야 한다.
profile
IT's 호기심 천국

2개의 댓글

comment-user-thumbnail
2020년 12월 1일

좋은 글 감사합니다! 정리가 잘 되어있어 이해가 쏙쏙 잘되네요 👍

답글 달기
comment-user-thumbnail
2024년 5월 7일

좋은 글 감사합니다~!!

답글 달기