이전 글 <Web 기초 / 용어 정리>를 보면,
웹이라는 것은 결국 "웹 서버와 클라이언트"로 구성되어 있는 인터넷 시스템이라고 이해할 수 있습니다.
Client 에서 HTTP(S) 프로토콜의 요청(Request)를 보내면,
요청을 항상 대기 하고 있던 Web Server는 요청에 알맞는 답변(Response)을 HTTP(S) 프로토콜로 다시 보내줍니다.
위와 같이 구성하기 위하여... 실제로는 아래와 같이 설정합니다.
- Client = 웹 브라우저 (Chrome, Edge, Whale...)
- Web Server = Web Server SW (Nginx, Apache, MS-IIS 등) 가 설치되어 있는 PC
*실제로 Web Server 뒷단에 정적인 컨텐츠를 처리하는 Web Application Server (WAS) 개념도 있지만, 이 부분은 다음 글에서 다루도록 하겠습니다.
현재 기준으로는 Nginx가 점유율 1위, 그 다음으로는 Apache, MS-IIS가 사용되고 있습니다. 가장 유명한 3개에 대하여 작성해보겠습니다.
최초의 웹서버 NCSA httpd의 버그를 고치다가 Apache HTTP Server(Process 기반 Web Server) 가 1996 탄생되었습니다.
- [+Prefork] 하나의 Client = 하나의 프로세스를 배정하였기 때문에, Prefork 방식을 통하여 미리 프로세스를 만들어 놓습니다.
- [+확장성] perl, PHP등 다양한 모듈을 서버에 빠르게 기능을 추가할 수 있었기 때문에 동적 컨텐츠가 어느정도 처리 가능하였습니다. 이러다 보니 요청을 받고 처리하는 것을 한개의 서버에서 수행하는 것이 가능했습니다.
하지만, 1999년도 컴퓨터의 보급과 함께 인터넷 트래픽이 늘어나면서, Connection 10000 Problem (C10K) 문제가 발생합니다. 동시에 연결된 커넥션 수가 많을 때(만개의 단위...), 새로운 커넥션을 생성할 수 없는 이슈가 발생했습니다.
- Apache의 구조인 Prefork 방식때문에, 커넥션이 형성될 때마다 프로세스 할당되며 "메모리 부족" 발생합니다.
- 확장성을 위하여 추가된 모듈이 차지하는 자원이 많아지면서 "무거운 프로그램"이 되어 버렸습니다.
- 동시에 많은 커넥션을 처리할 때 컨텍스트 스위칭이 많아셔 "CPU 부하" 발생합니다.
구조적인 한계를 해결하기 위하여 Apache도 MPM이라는 Multi Processing Module를 적용합니다.
Apache 구조의 근본적인 문제를 해결하는 새로운 구조의 Nginx(Event 기반 Web Server)가 2004 탄생합니다.
Nginx는 Apache를 대신하는 것이 아니라, Apache 앞단에서 동시 커넥션을 처리하기 위하여 나왔습니다.
Nginx 자체가 Web Server이기도 하기 때문에 스스로 정적파일을 처리하도록 하고, 동적 컨텐츠는 뒤에 있는 Apache에서 해결하도록 하였습니다.
- 마스터 프로세스 (Master Process): 설정 파일을 읽고 워커 프로세스를 생성
- 워커 프로세스 (Worker Process): 실제로 일을 처리하며, 워커 프로세스 각자 지정된 리슨 소켓을 배정 받음
- Event 관리 (커넥션 형성, 커넥션 제거, 새로운 처리)
- 소켓으로 새로운 클라이언트의 요청이 들어오면 커넥션을 형성하고, 요청을 처리하고, Keep-Alive 시간만큼 유지됩니다.
- 형성된 커넥션에 아무런 요청이 없으면, 새로운 커넥션을 형성하여 또다른 요청을 처리합니다.
- OS 커널이 Event를 큐 형식으로 워커 프로세스에게 전달 -> 워커 프로세스가 쉬지않고 일을 한다는 장점
(비동식 방식으로 대기, 워커 프로세스는 하나의 스레드로 처리) - CPU 개수만큼 워커 프로세스 존재 (CPU의 컨텍스트 스위칭 감소)
- 쓰레드 풀 (Thread Pool): Disk IO 이벤트와 같이 시간이 오래 걸리는 이벤트 처리하기 위하여 별도로 존재
- 개발자 기능 추가시,
마스터 프로세스가 새로운 워커 프로세스 생성하고,
기존의 워커 프로세스에 새로운 커넥션 생기게 하지 않아서 동적으로 설정 변경이 가능하게 합니다.
즉, 서비스를 종료 하지 않고도 커넥션에 문제 없이 설정을 변경할 수 있습니다.
장점은 "동시 커넥션 양 최소 10배 증가" "동일한 커넥션 수일 때 속도 2배 향상" "동적 설정 변경" 가능합니다.
현재는 Nginx의 이러한 장점을 살려서 아래와 같이 활용하고 있습니다.
- Web Server 뿐만 아니라, Reverse Proxy, Load Balancer 기능
- Web Server 가속기 역할: SSL Termination, HTTP Caching 수행
- HSTS, CORS, TCP/UDP 커넥션 부하분산, HTTP/2,3 지원
*Nginx에서 활용하는 Process & Thread라는 중요한 개념을 정확히 이해하기 위해서, 다음 글은 Process & Thread에 대하여 심층적으로 다루겠습니다.
그럼 MS Internet Information Service (IIS)는 언제 쓸까요?
- Windows OS에서만 실행 가능하며, Windows 환경과 최적화 되어 있음
- Windows 환경에서 작동 및 GUI를 지원하기 때문에, Windows 사용자는 훨씬 배우고 관리하기 쉬움
정말 간단하게 요약해보자면...
- 확장성을 위한다면 Apache
- 동시 접속을 위한다면 Nginx
- Windows 환경을 사용하고 있다면 MS IIS
당연히 위와 같이 너무 간단하게만은 생각할 수 없고, 각각의 장단점을 잘 살펴가면서 웹 서버를 선택하면 될 듯 합니다.
Reference
https://velog.io/@sawa1989/Ngnix
https://www.youtube.com/watch?v=6FAwAXXj5N0
'IT > Web' 카테고리의 다른 글
Ubuntu에서 간단하게 Flask로 Web Server 만들기! (0) | 2024.01.05 |
---|---|
Web 기초 / 용어 정리 (0) | 2023.11.07 |
댓글