이번에 웹기반 서비스를 하나 만들기 시작하면서 웹서버로 어떤 제품을 사용할까 고민을 해 보았습니다.

전통적으로 오랫동안 신뢰하고 사용하는 Apache로 할 것인가? 아니면 요즘 뜨고 있는 Nginx로 할 것인가?

단순하게 호기심만으로 선택한다면 이전에 다루어 보지 못했던 Nginx를 선택하고 싶었지만, 이번 기회에 Apache와 Nginx의 차이점을 비교해 보고 제가 기획하고 있는 서비스의 목적에 어떤 제품이 더 적당한지 판단해 보기로 했습니다.

우선 만들어야 하는 서비스(시스템)의 특성에 대해서 나열해 보겠습니다.
  • 서비스의 사용자
    • 불특정 다수의 일반인을 대상으로 하는 서비스
    • 사용자가 갑자기 증가할 수 있으므로 scalability 를 고려해야 함.
  • 서비스 제공 방식
    • 웹 브라우저와 모바일 App을 통한 UI제공
    • UI에서(Client) Http 프로토콜을 이용한 RESTful 방식으로 서비스를 요청함.
  • 개발 언어
    • 빨리 개발할 수 있는가?의 측면에서는 상대적이겠지만, 개발 조직에게 가장 익숙하고 커뮤니티가 활성화 되어 있는 Java를 선택하기로 하였고, 따라서 WAS(Servlet container)를 사용해야 함
  • 인프라 환경
    • Amazon AWS의 EC2 나 Google AppEngine을 고려하고 있음.
    • 가용할 수 있는 resource가 풍족하지 않고 제한적임

위와 같은 특성을 기준으로 웹서버 선택에 중요한 조건들을 나열하면 아래와 같습니다.
  • 로드 밸랜싱(Load Balancing)을 지원해야 함.
  • Micro Services Concept 을 유연하게 지원할 수 있어야 하며, 패턴에 의한 URL Redirect, Virtual 기능등을 지원해야 함
  • WAS 와 연계가 가능해야 함.(Tomcat 등의 Servlet Container 와의 bridge 제공)
  • Static Resource serving이 가능해야 하지만 주 사용목적은 WAS로의 bridge 및 load balancer 기능 제공임
  • 불특정 다수의 사용자가 대상이므로 보안(Http Authentication) 및 SSL 사용이 가능해야 함
  • 클라우드 환경에서 서비스 되므로 System Resource를 최대한 적게 사용해야 함
그럼 Apache와 Nginx에서 제공하는 기능들을 비교해 보고 선택조건에 최대한 부합하는 제품은 어떤 것이 될지 비교해 보겠습니다.

Concern Point

Apache

Nginx

Reverse Proxy 기능 제공
제공함
제공함
Virtual Host, URL Redirect 기능제공함
제공함
WAS Bridge 제공제공함제공함
보안 기능(Http Authentication), SSL 제공제공함제공함

System Resource 사용량 ( 메모리 )

수백메가

수메가



위의 비교를 보면 Apache보다는 Nginx를 사용하는것이 올바를 선택으로 보입니다.
사실 동일조건의 성능 테스트에서 Nginx가 Apache보다 5배 정도 빠른 것으로 알려져 있습니다.

NetFlix를 비롯한 대량의 요청을 처리하는 많은 서비스들이 Apache에서 Nginx로 옮겨가고 있는 추세이기도 합니다.
그렇다면 Apche와 Nginx는 왜 그렇게 성능의 차이가 날까요? Apache 개발자는 Nginx 개발자 만큼 똑똑하지 못해서 Apache의 성능을 더 좋게 만들지 못하는 것일까요?

저는 그렇지는 않다고 생각합니다. 그 원인은 Apache와 Nginx의 태생의 배경에서 찾아볼 수 있습니다.
Apache는 과거 Java Servlet이 대중적이지 않을 당시에 웹 기반 어플리케이션을 만들수 있는 거의 유일한 대안이었습니다.바로 CGI를 이용하는 것인데, 이때는 많은 웹 서비스들이 C나 Perl로 만들어져 있는 CGI를 이용해서 서비스를 제공 하였습니다.( 초장기 Naver의 서비스도 거의 모두 C나 Perl로 만들어진 CGI를 통해서 서비스를 제공했습니다.) 이러다 보니 processe-base(fork 방식)로 개발할 수 밖에 없었고, 상대적으로 NginX는 웹 어플리케이션을 서비스하기 위한 목적보다 Http Proxy의 목적으로 개발되었기 때문에 event-base(비동기 방식의 요청 전달)방식으로 개발되어 동시 사용자에 대한 처리 능력이 더 좋을 수 있게 된것 같습니다.
실제로 Nginx는 FCGI, SCGI 기능은 제공하지만 CGI나 ISAPI는 제공하지 않습니다.

즉, WAS를 비롯한 Web Application을 별도로 가져가지 않고(Tier를 분리하지 않고) CGI를 통한 light한 웹서비스를 제공하고자 한다면 Apache를 선택하는 것이 옳지만, Web Server를 Http Proxy방식으로 사용하고자 하다면 Nginx를 사용하는 것이 바람직 하다는 생각입니다. 물론 Nginx에서도 Apache에서 처럼 Static한 resource(html,js,css,images)들에 대한 서빙도 매우 잘 한다고 합니다.
이번 기회에 한번 설치해서 사용해 보고 시간이 되면 사용기도 한번 올려보도록 하겠습니다.




Posted by 용이~☆