지적과 댓글은 언제나 환영합니다!
이 포스팅은 [10분 테코톡] 🤫 피케이의 Nginx - YouTube 내용을 텍스트로 옮기고 살을 덧붙였습니다.
관련 내용 원문은 영상을 보시는 것을 추천드립니다!
개요
웹 서버와 WAS의 차이점이 무엇인가요?
NginX,
Apache Server,
Apache Tomcat,
Jetty, Netty, Undertow 등
웹 생태계에 발을 들이다보면,
다양한 종류의 웹 서버와 WAS 종류를 들어봤을 것이다.
하지만, 정확하게 웹 서버와 WAS(Web Application Server)의 역할을 설명하려고 했을때
말문이 막혔거나 멈칫했던 경우가 있다면 오늘 같이 짚고 넘어가보도록 하자.
목표
- 웹서버와 WAS의 역할과 차이점을 이해한다
- 주로 사용되는 Nginx, Apache Server / Tomcat, Jetty의 차이점을 알아본다.
여정
웹서버와 WAS
먼저 웹서버와 WAS의 핵심적인 차이점은
제공하는 컨텐츠가 정적이냐? 동적이냐? 라고 할 수 있다.
웹서버는
- HTTP 프로토콜을 기준으로
- 브라우저에서 요청을 받았을때
- 정적 컨텐츠(HTML, CSS, 이미지, 파일)을 제공한다.
반면, WAS는
- HTTP 프로토콜을 기준으로
- 브라우저에서 요청을 받았을때
- 동적 컨텐츠(복잡한 로직처리, DB 조회 등)을 제공한다.
물론, WAS는 웹 서버 역할도 수행할 수 있다.
하지만 이는 권장하지 않으며, 분리해야 하는 이유가 되기도 한다.
첫번째로는 속도 저하 측면이다.
정적 컨텐츠는 즉시 로딩이 가능하지만, 동적 컨텐츠는 응답을 기다려야한다.
따라서, 한 서버에서 처리하기 보다는,
웹 서버와 WAS로 나누어 사용하는 것이 더 빠르다.
두번째로는 분산 아키텍쳐를 가져갈 수 있게 된다.
- 웹 서버가 먼저 요청을 받고, 필요한 동적 컨텐츠를 WAS로 전달한다.
- 여러 대의 WAS를 연결하고 웹 서버에서 트래픽을 골고루 나눠주는 로드 밸런싱이 가능해진다.
- WAS에 장애가 발생하면, 다른 WAS로 트래픽을 전달하는 Fail Over가 가능해진다.
웹 서버는 정적 컨텐츠만 주고받는 것이 아니였나요?
이 부분이 오늘의 핵심 파트이다.
아파치 웹 서버는 1995년에 등장했다.
당시 웹 서버에서 처리하는 컨텐츠의 크기가 크지 않았기 때문에,
하나의 서버에서 정적, 동적 컨텐츠를 모두 처리하였다.
또한, 프로세스를 미리 만들어놓고 사용하는
prefork 방식을 채용했기 때문에 개발하기 쉽고 확장성이 좋았다.
하지만, 동시 커넥션 수가 10,000개를 넘어서면
아파치 웹서버의 구조상 버티지 못하는 문제가 발생했다.
주요인은 프로세스 할당 방식이였다.
쓰레드가 아니라 프로세스를 할당하는 방식은
메모리 부족, 잦은 컨텍스트 스위칭으로 제속도를 내지 못했다.
이를 보완하기 위해 나온 웹 서버가 Nginx이다.
바로 이 Nginx가 로드 밸런싱과 Fail Over를 할 수 있게 해준다.
Nginx는 아파치 웹 서버의 대체재도 될 수 있지만, 보완재로도 사용이 가능했다.
그 자체로도 웹 서버 역할을 할 수 있지만
이미 존재하는 웹 서버 앞 단에 Nginx를 두게 되면
더 많은 커넥션을 대신 유지할 수 있었기 때문이다.
하지만, Nginx도 프로세스 생성 방식으로 커넥션을 유지한다.
아파치가 프로세스를 최대 10,000개 가량 만드는 것과 대조적으로
Nginx의 프로세스는 몇십개에 불과하다.
분명 같은 방식이지만, 프로세스 생성 수는 엄청난 차이를 보인다.
어떻게 더 많은 커넥션을 유지할 수 있는 걸까?
Nginx의 비결
Nginx는 아파치 웹 서버가 겪었던 문제를 해결하기 위해
(컨텍스트 스위칭을 최소화하기 위해)
워커 프로세스를 CPU 코어 수만큼 할당한다.
Nginx는 마스터 프로세스를 두어
사용자가 정해둔 설정대로 워커 프로세스를 생성하도록 한다.
웹 서버는 일반적으로 요청이 들어오면
커넥션을 정해진 시간(keep-alive)만큼 유지한다.
기존 아파치 웹 서버의 경우 이를 유지하기 위해
한 프로세스당 커넥션 하나를 할당했는데,
Nginx의 경우는 한 워커 프로세스가 여러 커넥션을 담당할 수 있다.
워커 프로세스는 커넥션 생성/제거를 이벤트 방식으로 처리한다.
OS 커널에서 이러한 이벤트를 큐에 담아 비동기 방식으로 처리하기 때문에
워커 프로세스가 쉬지않고 계속 일을 할 수 있게 된다.
또한, I/O 작업과 같이 시간이 오래 걸리는 작업을 위한
쓰레드 풀도 준비되어 있다.
즉, 워커 프로세스는 I/O 작업을 맡겨놓고 다른 요청을 처리할 수 있게 된다.
이러한 특징 때문에 초당 요청 수는
아파치 웹 서버 대비 2배 가까운 결과를 보이기도 한다.
이러한 극명한 장점에도
Nginx는 출시된지 4년만인 2008년에야 빛을 보기 시작했다.
급변하는 인터넷 환경
2008년쯤부터는 스마트폰이 등장하면서
인터넷 환경은 급격하게 바뀌기 시작했다.
잦은 요청, 늘어난 동시 접속자 수, 비대해진 컨텐츠 용량으로
아파치 웹 서버로는 처리하기 버거운 문제들이 등장했다.
Nginx의 인기 비결은 단순 커넥션 수에만 있지 않았다.
Nginx는 아래와 같이 현대 웹 환경에 어울리는 장점을 가진다.
- 내부 네트워크 간 SSL을 제거하여, HTTPS → HTTP 통신으로 부하를 감소시킨다.
- 같은 요청에 대해 캐싱을 적용하여 부하를 감소시킨다.
- 가상호스팅으로 하나의 웹 서버에서 다수의 WAS와 연결할 수 있다.
- WAS 간 로드 밸런싱으로 부하를 안정적으로 처리할 수 있다.
이 때문에, 아파치 웹 서버를 사용하는 기업들이
발빠르게 Nginx를 채택하면서 점유율이 상승하기 시작했고,
23년 현재 아파치 40%, Nginx 28%로 1, 2위를 차지하게 되었다.
물론 아파치 웹 서버도 많은 개선을 통해
여전히 강력하고 안정적인 성능을 발휘한다.
아파치 웹 서버와 Nginx는 경쟁구도가 아니라는 점을 한번 더 명심해두자.
참고자료
[10분 테코톡] 🤫 피케이의 Nginx - YouTube
'Do you know?' 카테고리의 다른 글
아시나요? 함수형 프로그래밍 - (1) 개념 (0) | 2023.07.16 |
---|---|
아시나요? - 객체지향의 사실과 오해 (0) | 2023.05.14 |
아시나요? 의존성 주입(DI, Dependency Injection) (0) | 2023.01.18 |
아시나요? TDD, Clean Code (0) | 2023.01.18 |
아시나요? REST, REST API, RESTful API (0) | 2023.01.18 |