웹 서버는 HTTP 프로토콜을 통해 읽힐 수 있는 문서 처리를 하며 일반적으로 웹 어플리케이션의 앞단에 배치된다.
동적인 리소스는 WAS에서 처리하고 정적인 리소스는 WEB에서 처리하여 보다 효율적으로 서버를 구성할 수 있다.
웹 서버로 사용되는 것 중 가장 대표적인 두 가지가 바로 Apache와 Nginx!
이 둘의 차이점은 무엇일까?!
현업에서 아직 가장 많이 사용되는 웹 서버라고 한다.
Client에서 요청을 받으면 MPM(Multi Processing Module : 다중처리모듈)이라는 방식으로 처리를 하는데, 대표적으로 Prefork와 worker 방식이 있다.
Apache는 WAS로 Apache Tomcat을 연동하는 경우, mod_jk
, mod_proxy
, mod_proxy_ajp
방식을 Apache 자체적으로 지원하기 때문에 다양하고 효율적으로 연동이 가능하다.
또한, Nginx에 비해 모듈이 다양하다.
클라이언트 접속마다 process 혹은 thread를 생성하는 구조이다. 따라서 여러 클라이언트로부터 동시 접속 요청이 들어온다면 CPU와 메모리 사용량이 증가하고 추가적인 process/thread 생성 비용이 드는 증 대용량 요청에서 한계를 보인다.
또, Apache 서버의 프로세스가 blocking 될 때 요청을 처리하지 못하고 처리가 완료될 때까지 대기 상태에 머무른다. 이는 keep alive(접속 대기)로 해결이 가능하지만 효율이 떨어진다.
Nginx의 가장 큰 특징은 Event Driven 방식이다. Event Driven 방식은 요청이 들어오면 어떤 동작을 해야하는지만 알려주고 다른 요청을 처리하는 방식이다.
그렇기 때문에 프로세스를 fork하거나 스레드를 사용하는 아파치와 달리 CPU에 관계 없이 모든 IO들을 Event Listener로 미루기 때문에 흐름이 끊기지 않고 응답이 빠르게 진행된다. 즉, 1개의 프로세스로 더 빠른 작업이 가능하다.
Nginx는 한 개 또는 고정된 프로세스만 생성하고, 그 내부에서 비동기로 효율적인 방식으로 task를 처리한다. 따라서 동시접속자 수가 많아져도 추가적인 생성 비용이 들지 않는다.
비동기 이벤트 기반으로 요청하여 적은 양의 스레드가 사용되기 때문에 CPU 소모가 적다.
Context Switching 비용이 적다는 장점도 있다.
** Context Switching
: A작업을 진행할 때 A스레드의 Context를 읽어오며, B스레드로 전환할 때 A스레드의 Context를 저장하고 B스레드의 Context를 읽어오는 일련의 반복작업을 한다. 즉, 스레드 갯수가 많아질 수록 context switching 작업은 더 빈번하게 일어나고 이 때문에 성능이 저하될 수 있다.
Apache는 안정성, 확장성, 호환성이 장점이라면, Nginx는 성능이 우세하고 속도가 빠르다는 장점이 있다!