웹 서버에 대해 좀 더 깊이 있게 배워보자.
지난번에 서버란 웹서버 소프트웨어가 설치되어있는 컴퓨터를 서버라고 불렀었다.
그러면 이 소프트웨어는 무엇이고, 무슨 역할을 하는 걸까?
웹서버의 종류
웹 브라우저에도 크롬, Microsoft Edge, Firefox 등의 제품 군이 있듯이,
웹서버 소프트웨어의 종류도 여러 개다.
대표적인 웹 서버 소프트웨어는 Apache, Nginx, IIS가 있다.
- Apache
- Nginx
- IIS
이번 게시물에서는 실무에서 많이 쓰이는 Apache와 Nginx를 비교하여 알아볼 것이다.
Apache
Apache는 1995년, Apache재단에서 만든 HTTP 서버이다.
아파치가 나온 당시 1995년에는 Unix 기반으로 만들어진 최초의 웹서버 NCSA httpd가 있었다.
하지만 위 프로그램은 버그가 굉장히 많았고, 뛰어난 개발자들이 버그를 수정하고 기능을 추가하여 Apache를 탄생시켰다.
아파치 서버는 Process-Driven 방식을 사용한다.
Process-Driven
Apache는 클라이언트로부터 받은 요청을 처리할 때 새로운 프로세스 혹은 스레드를 생성하여 처리한다.
즉, 새로운 요청이 들어올 때마다 새로운 프로레스를 계속 생성한다.
프로세스를 만드는 것이 시간이 오래 걸리다 보니 요청이 들어오기 전에 프로세스를 만드는 prepork 방식을 사용해, 새로운 요청이 들어왔을 경우, 미리 만들어둔 프로세스를 가져다 사용할 수도 있다.
위와 같은 방식은 개발하기 쉽다는 장점이 있었고, 개발자들은 다양한 모듈을 만들어 확장성을 넓혔다. 결과로, Apache는 나온 지 1년 만에 NCSA HTTPd를 대체하여 세계 1위 웹서버 타이틀을 가져갔다.
Nginx
1995년에서 1999년도로 넘어가 보자. ✈️
이전까지만 해도, 새로운 요청이 들어올 때마다 새로운 프로세스를 생성하는 Apache의 방식은 큰 무리가 없었다.
하지만 점점 컴퓨터가 보급되고 요청이 많아지면서 Apache의 치명적인 단점이 드러났다.
Apache에서 서버에 동시 커넥션이 많아졌을 때, 더 이상 커넥션을 생성하지 못하는 문제가 생기게 된 것이다.
C10K
Apache에서는 요청이 들어오면 프로세스를 새로 만들고, 100개의 요청이 동시에 들어오면 프로세스 100개가 생성되는 셈이다. 따라서 동시접속이 늘어날수록 CPU가 잡아먹는 memory의 사용도 비례하여 증가하게 된다.
더욱이 아파치 서버의 장점이었던 다양한 모듈 확장성은 프로세스가 차지하는 리소스의 양을 늘렸고, Context swiching을 많이 하여 CPU가 감당해야 할 부분이 증가했다.
즉, 네트워크 소켓 수가 1만 개가 넘어가면 하드웨어 성능이 아무리 좋아도 Apache의 웹 서버의 성능이 급격하게 떨어지는 C10K 문제가 생긴 것이다.
(최근에는 비동기 모드 MPM(Multi Processing Module) 방식을 도입하여 프로세스가 여러 개의 스레드를 가질 수 있도록 했지만, 요청이 들어올 때마다 스레드를 만들어야 한다는 부담은 현재 진행형이다.)
Apache의 C10K를 해결하기 위한 목적으로 만들어진 게 NginX이다.
NginX의 동작 방식은 이벤트 드리븐 구조(Event-driven)로 Apache와 달리 동작이 단순하고 전달자 역할만 하여 동시접속에 특화되어있다.
또한 Apache 보다 가볍고 여러 요청을 한 번에 처리할 수 있다는 장점이 있다.
Event-Driven
이벤트 드리븐에 대해 좀 더 자세히 알아보자.
NginX가 C10K를 해결한 비결은 요청이 많이 들어와도 프로세스를 늘리지 않는 것이다.
엔진엑스는 설정 파일을 읽고 워커 프로세스를 생성하는 마스터 프로세스(하나)와, 실제로 유저의 요청을 처리하는 워커 프로세스로 구성된다.
엔진엑스가 구동되면 마스터 프로세스는 정해진 숫자만큼의 워커 프로세스(설정 파일에서 정의된 수)를 생성하고 리슨 소켓(워커 프로세스와 통신할 수 있는 소켓 디스크립터)를 배정한다.
엔진엑스에서는 TCP(orUDP) Connection의 연결, 유저의 HTTP request 처리, Connection 종료까지의 모든 절차를 이벤트라는 개념으로 취급하고 처리하는데, 위 설명했던 워커 프로세스가 eventQueue 하나를 가지고, 단일 eventLoop내에서 커넥션에 대한 작업을 처리한다.
NginX vs Apache
웹서버 점유율 1위를 차지하던 Apache는 최근(2022년 기준), NginX 웹 서버 소프트웨어 순위 1위를 차지하게 되었다.
그럼 다중 처리 성능이 밀리는 Apache는 이제 퇴물이 되어버린 것일까..?
그렇지만은 않다.
Apache는 버그가 많던 NCSA httpd를 해결하기 위해 나온 솔루션인 만큼 탁월한 안정성과, 여전히 다양한 모듈을 이식할 수 있다는 확장성의 장점을 가지고 있다.
또한 OS 안정성 역시 Apache가 더 뛰어나다.
Apache는 window에서도 Unix계열에서와 동일한 성능을 보장시키지만, NginX는 window를 완벽하게 지원하지 않는다.
'CS' 카테고리의 다른 글
[CS] TCP, UDP의 정의와 특징 (0) | 2023.04.23 |
---|---|
[CS] OSI7 Layer, TCP/IP Updated (2) | 2023.03.16 |
[CS] 서버와 클라이언트 (0) | 2022.08.21 |
[CS] SSR vs CSR (0) | 2022.07.22 |