Apache

  • CGI를 통한 웹서비스를 위해 생겨남

  • CGI : 외부의 응용 프로그램(검색 엔진이나 데이터베이스 검색 프로그램 등)과 웹서버를 연결시켜주는 "표준"을 의미한다. 독립적으로 실행되는 응용 프로그램에 웹에서 입력받은 자료를 이들 응용 프로그램의 입력으로 전달한다든지, 응용 프로그램에서 실행된 결과를 웹에 전달해야 하는 등의 일을 위해서는 일정한 변수 전달 방법이 필요하다. 이러한 일의 실행을 위해 사용되는 "표준 방법"이 CGI이다.

  • Apache는 Client로 부터 요청을 받으면 MPM (Multi Processing Module : 다중처리모듈) 이라는 방식으로 처리를 하는데 대표적으로 두가지가 있다.

  • 구동 방식 :

    • Prefork MPM

      • 실행 중인 프로세스를 복제하여 실행한다.
      • 요청량이 많아질수록 프로세스는 증가하지만 복제시 메모리 영역까지 복제되어 동작하므로 프로세스간 메모리 공유가 없어 비교적 안정적이다. (메모리를 많이 사용)
      • 1개의 자식 프로세스가 1개의 스레드를 갖는 구조로, 자식 프로세스는 최대 1024개까지 가능하다.
      • 응답 프로세스를 미리 띄어놓고 클라이언트 요청 시 자식 프로세스가 반응하게 되는 방식이다.
      • 디버깅이 빈약한 플랫폼에서 쉬운 디버깅이 가능하다.
      • Prefork 방식은 일반적으로 Sing CPU 또는 Dual CPU에서 성능이 더 좋다.
    • Worker MPM

      • 1개의 프로세스당 최대 64개의 스레드 처리가 가능하고 각 스레드는 한 번에 한 연결을 담당한다.
      • 스레드 간에 메모리를 공유합니다. (Prefork 방식보다 메모리 적게 사용)
      • Prefork보다 메모리 사용량이 적고 통신량이 많거나 동시 접속자가 많은 사이트에 적합하다.
      • Worker 방식은 일반적으로 Multi CPU 시스템에서 성능이 좋다.
    • Apache 서버의 프로세스가 블록킹이 되면 요청을 처리하지 못하고, 처리가 완료될 때까지 계속 대기하게 되는데 이는 Keep Alive를 이용해 해결이 가능하다. 하지만 Keep Alive 때문에 대량 접속 시 효율이 떨어진다.

  • Keep Alive: 한 번 통신이 이루어지면 접속이 끊어 버리지 않고 KeepAliveTimeOut 시간 동안 끊지 않고 다음 접속을 대기하는 것

Nginx

  • 가벼움과 높은 성능을 목표로 만들어진 경량화된 웹 서버로 Http Proxy의 목적이 강함

  • 정적처리에서 비교적 강점을 보인다.

  • 리버스 프록시(Reverse Proxy) 및 메일 프록시(Mail Proxy) 기능을 가지고 있어 이러한 용도로 활용되기도 한다.

  • 구동 방식 :

    • Event-Driven 처리 기반 구조는 여러 개의 커넥션을 모두 Event-Handler를 통해 비 동식 방식으로 처리해 먼저 처리되는 것부터 로직이 진행하도록 합니다. 이러한 기법의 주 사용 목적은 대화형 프로그램을 만드는 데 사용하는데 PCP 처리와 유사합니다.
    • Event-Driven 방식: 요청에 대한 각 상태를 정해서 Event가 발생할 때마다 event를 처리
    • NginX는 스레드를 많이 사용하지 않기 때문에 context Switching 비용이 적고 CPU 소모도 낮다.
    • 적은 수의 스레드로 효율적으로 일 처리하며, 스레드당 할당되는 메모리도 적게 사용하는 구조이다.
    • CPU와 관계없이 모든 IO들을 전부 Event Listener로 미루기 때문에 흐름이 끊기지 않고 응답이 빠르게 진행이 되어 1개의 프로세스로 더 빠른 작업이 가능하게 될 수 있다.
  • 메모리 측면에서 NginX가 Apache보다 적은 시스템 자원으로 처리한다는 장점이 있습니다.


 

다른 분들의 의견:

  • 개인적이며, 저사양, 저비용, 저인력으로 서버를 운영하고 관리하려 한다면 성능측면에서 엔진엑스(Nginx)를 조심스럽게 권장
  • VPS의 성능을 고려한다면 NGINX, 유지보수를 고려한다면 APACHE
  • 각자 태생적인 부분을 이해하고 상황에 맞게 사용하는 것이 중요

 

참고
https://blog.kinesis.kr/185
https://taetaetae.github.io/2018/06/27/apache-vs-nginx/
https://has3ong.github.io/apache-nginx/
https://cntechsystems.tistory.com/24
http://snuet.com/CML/C05/C05_02.html

+ 따끈한 최근 게시물