웹 서버는 Apache, NginX와 같은 서버로 정적 웹 리소스를 클라이언트에게 서빙하는 역할을 합니다.
여기서 정적 웹 리소스는 사용자가 서버의 내용을 조작할 수 없는 리소스를 의미합니다.
정적 웹 리소스가 될 수 있는 것은 .html, .css, .js, .jpeg, .mp4, .mp3 와 같은 많은 리소스 들이 있습니다.
아파치 HTTP 서버는 아파치 소프트웨어 재단에서 개발하는 HTTP 웹 서버입니다. 대부분의 OS에서 사용가능합니다. 또한 현재 가장 많이 사용되는 웹 서버이기도 합니다.
참고로 그냥 Apache 서버라고도 부르며, 이는 Apache 재단에서 가장 인기있는 프로그램이기 때문입니다.
또한 1996년 이래로 가장 인기 있는 웹서버의 자리를 차지하고 있기 때문에, 풍부한 문서, 풍부한 모듈, 풍부한 레퍼런스 등의 이점을 가지고 있으며, 유연성과 성능 광범위한 지원을 통해 관리자들이 많이 선택합니다.
또한, 많은 인터프리터 언어(뭘까요?)를 지원해 별도의 소프트웨어가 필요없습니다.
C10K 문제에 대해서 해결하기 위해서 Nginx가 개발되었습니다. C10K 문제는 웹 서버가 현대의 웹 요구사항으로 10000개 이상의 동시 연결을 처리하기위한 도전에 대한 문제입니다. 2004년에 공개적으로 릴리즈 되었으며, 비동기, 이벤트 주도 아키텍처를 사용하여 이 목표를 달성했습니다.
Nginx는 가벼운 리소스 사용률과 최소한의 하드웨어로 쉽게 확장할 수 있는 능력으로 출시 후 인기가 높아졌습니다. Nginx는 정적 컨텐츠를 빠르게 서빙하는데 탁월하고, 목적에 더 적합한 소프트웨어에 요청을 동적으로 전달할 수 있도록 디자인 되었습니다.
Nginx는 리소스 효율성과 부하시 응답성을 위해서 자주 선택합니다. Nginx 옹호자들은 Nginx가 집중하고 있는 웹 서버 코어와 프록시 기능을 좋아합니다.
Apache와 NginX는 둘을 합쳐 전체 웹 서버의 50% 이상을 차지하고 있는 가장 많이 사용되는 웹 서버 입니다.
둘은 많은 부분이 비슷하지만, 그렇다고 상호간에 완전히 대체가 가능한 것은 아닙니다.
-
연결 처리 아키텍처
Apache와 Nginx는 다른 트래픽 상황에서 이를 처리하는 방식에 차이가 있습니다.
아파치는 다양한 멀티 프로세싱 모듈(MPM)을 제공합니다. 이는 클라이언트의 요청이 처리되는 방식을 결정합니다.
아차피는 다른 커넥션과 요청 처리 알고리즘을 유연하게 선택할 수 있도록 하는 아키텍처를 제공합니다.
Nginx는 대규모 사이트에서 직면할 동시성 문제에 대해서 더 많이 인식하면서 등장했습니다. 따라서 Nginx는 비동기, 논블로킹, 이벤트 기반 연결 처리 알고리즘을 처음부터 사용했습니다.
Nginx는 각각 수천개의 연결을 처리할 수 있는 워커 프로세스를 생성합니다. 워커 프로세스는 이벤트를 지속적으로 확인하고 처리하는 빠른 루핑 메커니즘을 구현하여 이를 수행합니다.
워커가 처리하는 각 연결은 다른 연결과 함께 존재하는 이벤트 루프 내에 배치됩니다. 루프 내에서 이벤트는 비동기적으로 처리되며, 작업을 논블로킹 방식으로 처리할 수 있습니다. 연결이 닫히면 루프에서 제거됩니다.
이런 스타일의 연결 처리를 통해서 Nginx는 제한된 리소스로 엄청나게 확장할 수 있습니다. 서버가 단일 스레드이고 프로세스가 각각의 새로운 연결을 처리하기 위해서 생성되지 않기 때문에, 메모리 및 CPU 사용량은 부하가 높은 경우에도 비교적 일관된 상태를 유지하는 경향이 있습니다.
-
정적 vs 동적 컨텐츠
실제 사용 사례와 관련해서 Apache와 Nginx간의 가장 일반적인 비교 중 하나는 각 서버가 정적 및 동적 콘턴츠에 대한 요청을 처리하는 방식입니다.
Apache 서버는 기존의 파일 기반 메서드를 사용하여 정적 컨텐츠를 처리할 수 있습니다. 이런 작업의 성능은 위에서 설명한 MPM 메서드의 기능입니다.
Apache는 외부 구성 요소에 의존하지 않고도 웹 서버 내에서 동적 콘텐츠를 실행할 수 있습니다.
Nginx는 기본적으로 동적 콘텐츠를 처리하는 기능이 없습니다. 그래서 외부 프로세스에 요청을 전달하고 응답이 올 때 까지 기다린 다음 클라이언트에게 결과를 전달할 수 있습니다.
이는 관리자가 Nginx가 사용하는 프로토콜 중 하나를 통해서 Nginx와 프로세스간에 통신을 구성해야 함을 의미합니다.
이 방법의 장점은 동적 인터프리터도 워커 프로세스에 포함되지 않으므로, 오버헤드는 동적 콘텐츠에서만 나타납니다. 정적 컨텐츠는 간단한 방식으로도 제공될 수 있습니다.
-
분산된 vs 중앙화된 설정
-
파일 vs URI 기반 해석
Apache는 파일 기반의 웹서버로 만들어져서 기본적으로 요청을 파일 시스템 리소스로 해석합니다. 문서 루트를 가져와서 호스트 및 포트번호 뒤의 요청 부분을 추가하여 실제 파일을 찾는 것으로 시작합니다. 그래서 웹에서 사용 가능한 문서 트리 형태로 표시됩니다.
Nginx는 웹 서버이자 프록시 서버로 만들어졌습니다. 이 두 역할에 필요한 아키텍쳐로 인해서 URI로 작동하고, 필요한 경우에 파일 시스템으로 변환됩니다.
Nginx는 URI 자체를 구문분석 합니다.
-
모듈
서버는 동적으로 모듈을 로드하거나 언로드 할 수 있습니다. 코어는 항상 떠있으며 모듈을 켜거나 끄는 동작으로 추가 기능을 추가하거나, 제거하고 메인 서버에 연결할 수 있습니다.
모듈은 동적 콘텐츠 처리 및 URL 재작성, 클라이언트 인증, 서버 강화, 로깅, 캐싱, 압축, 프록시, 속도 제한 및 암호화 등에 사용할 수 있습니다.
Nginx는 모듈을 동적으로 로드 할 수 없어서 선택적으로 컴파일 해야합니다. 배포판을 사용하는 경우 일반적으로 사용하는 모듈은 기본적으로 포함되지만, 일반적이지 않은 모듈이 필요한 경우에는 직접 서버를 빌드해야 합니다.
-
지원, 호환성, 생태계, 문서화
오랫동안 인기있던 Apache는 매우 보편적입니다. 그리고 문서화도 잘 되어있고, 시장 점유율이 높기 때문에 지원을 많이 받을 수 있습니다.
Nginx는 성능을 위주로 보는 사용자가 많고, 초기 프로젝트가 러시아에서 시작되었기 때문에, 영어로 된 문서를 찾기 어려웠습니다. 하지만 현재는 영어로 된 문서도 많이 존재합니다.
바로 Nginx를 Apache 앞에 리버스 프록시로 배치하는 것입니다.
이렇게 하면, Nginx의 높은 처리 속도와 수많은 연결을 동시에 처리할 수 있는 능력을 가지고, 정적 콘텐츠는 Nginx를 통해서 빠르게 제공됩니다.
동적 콘텐츠는 Apache 서버에서 프록시를 통해서 처리되고, 렌더링 된 페이지를 반환하고 Nginx가 이를 클라이언트에 다시 전달합니다.
둘 다 강력하고 좋습니다. 적합한 서버를 아래의 내용을 참고해서 선택해봅시다.
Apache vs Nginx: Practical Considerations | DigitalOcean
웹 애플리케이션 서버는 Tomcat, Netty와 같이 동적으로 사용자와 상호작용하는 웹을 제공할 수 있는 서버입니다. 동적인 처리란, DB를 이용한 처리 등을 의미합니다. 이를 웹 컨테이너라고 부르고, 서블릿 스펙을 제공하는 경우 서블릿 컨테이너라고도 부릅니다.
웹 애플리케이션 서버는 웹 서버가 하는 일을 모두 수행할 수 있습니다.
하지만, 정적 리소스는 웹 서버에서 제공하고, 동적 리소스는 웹 애플리케이션 서버에서 제공하는 것이 서로가 잘 할 수 있는 일을 하도록 하는 것이고, 부하의 분산을 이뤄낼 수 있습니다.
또, NginX와 같은 여러 기능을 제공하는 웹 서버를 사용하면, WAS를 숨길 수 있고, 여러 대의 WAS를 하나의 웹서버로 제공하면서 무중단 배포와 같은 일들도 수행해낼 수 있습니다. 또한, Fail-over도 가능합니다.
[Web] Web Server와 WAS의 차이와 웹 서비스 구조 - Heee's Development Blog