Apache VS Nginx VS Tomcat

gnoesnooj·2023년 1월 29일
0

Apache VS Nginx VS Tomcat

서버에 대한 공부를 하던 중, 세 가지의 차이점을 알기 위해 공부를 하게 되었다.

WAS vs WS

우선 크게 WAS 와 WS 로 나눌 수 있다.
Apache와 Nginx는 WS, Tomcat은 WAS로 분류를 할 수 있다.

WS (웹 서버) 는 정적인 파일들을 제공하기 위한 서버라고 할 수 있다. html, css, 이미지 파일과 같은 정적인 컨텐츠를 처리해주는 서버이다.
그에 반에 WAS (웹 어플리케이션 서버) 는 동적인 처리를 위한 서버라고 할 수 있다. DB와 연동되어 필요한 데이터를 처리하고 반환해주는 역할을 수행한다.

WS에서 들어온 요청은 동적인 처리가 필요한 경우 WAS까지 요청이 도달하게 되고, WS 내에서 처리가 가능하다면 WAS를 거치지 않고 요청을 처리하게 된다.

Apache VS Nginx

Apache ?

우선 먼저 나온 서버는 apache 이다.

Apache는 프로세스를 일일히 하나의 요청마다 프로세스를 생성하는 것은 비용적인 면에서 좋지 않았기 때문에, Prefork 를 통해 미리 프로세스를 생성해 놓고, 요청이 들어올 시 각 요청에 대해 프로세스를 할당해줘서 요청을 처리하는 Process Driven 방식을 선택하였다.

하지만 해당 방식은 PC가 증가하고 발전함에 따라, C10K라는 문제를 맞닥뜨리게 된다.

C10K

점점 발전함에 따라, 요청은 미리 생성된 process들로는 처리가 힘들어지고, 그로 인해 모든 요청에 대해서 프로세스를 생성해내게 되어서 서버는 점점 무거워졌다.

또한 생성된 프로세스들의 CPU 컨텍스트 스위칭으로 인해 발생하는 비용도 상당해지게 되었다.

그리고 HTTP의 keep alive로 인해, 처리가 전부 되어도 해당 프로세스의 연결이 종료되지 않아 대기하는 프로세스들이 많아졌다.

물론 Apache는 프로세스 생성 제한, 프로세스가 아닌 멀티 스레드 방식 선택 등 성능 개선을 위해 발전을 하였다.

하지만 근본적인 구조를 개선하지 못하였고, 이 때문에 구조를 개선한 서버가 등장하게 된다.

Nginx

기존 아파치의 Process Driven 동작 방식에서, Event Driven 이라는 방식을 통해서 요청을 처리해주게 되었다.

기존 C10K의 문제가 발생한 근본적인 문제는 '하나의 요청에 하나의 프로세스 할당' 을 해주는 Process - driven의 문제였다.

Nginx는 이를 해결하기 위해 발생하는 모든 요청들과, 그 안에서 일어나는 요청, 응답을 모두 Event 라는 개념으로 취급을 해줬다.

또한 비동기 이벤트 구조 덕분에 워커 프로세스가 working queue에 처리해야할 일들을 쌓아놓고, 순서대로 처리하는 방식으로 요청을 처리해준다.

이로 인해 기존 keep alive로 인해 대기하고 있던 프로세스가 발생하던 것보다 훨씬 효율적인 처리가 가능해졌다.

Nginx의 단점 ?

  • 오래 걸리는 요청이 왔을 경우, 해당 요청이 속한 queue의 다른 요청들이 지연될 학률이 높다. 하지만 이는 파일 입출력 I/O와 같은 요청들을 따로 처리해주는 스레드풀을 통해서 문제를 해결해주었다.
  • 또 다른 단점으로는, Working queue의 존재 때문에, 해당 프로세스가 종료될 경우 해당 프로세스의 다른 요청들의 커넥션도 잃어버릴 수 있다는 위험성이 있다. 이로 인해 개발자가 또 다른 모듈을 만들기 어렵다는 단점이 있다.

그럼 apache는 쓰지 않나..?

OS 안정성, 디렉토리별 서버 추가 구성, 동적 모듈 지원 등과 같은 장점을 가진다.. nginx 는 성능의 이유로 추가 구성이 어렵다고한다. Apache는 특정 페이지만을 관리하는 서버와 같은 기능을 추가해줄 수 있다고 한다.

정리

  1. apache 와 nginx 는 WS, tomcat은 WAS
  2. apache 는 process driven. C10K + keep alive 로 인한 문제
  3. Event Driven 의 Nginx 등장
  4. 비동기 event driven + Working Queue 를 통해서 기존 apache의 문제 해결

+++

  • Nginx 는 로드밸런서의 역할도 한다.
  • 커넥션 제어와 정적 컨텐츠 처리에 강점이 있는 Nginx를 리버스 프록시 서버로 활용하고, 아파치를 백엔드 서버로 두는 구성은 두 서버의 장점을 함께 활용할 수 있는 방법이 될 수 있다고 한다. 찾아보고 포스팅해봐야겠다. !
profile
누구나 믿을 수 있는 개발자가 되자 !

0개의 댓글