https://www.youtube.com/watch?v=6FAwAXXj5N0&t=12s
1995년.
아파치 서버가 개발되었다.
아파치 서버는 요청이 들어오면 커넥션을 생성하기 위해서 프로세스를 만든다.
-> 유닉스 계열 OS가 네트워크 커넥션을 형성하는 모델을 그대로 적용한 것이다.
그런데 프로세스가 생성되는 시간이 오래 걸리다보니, 요청이 들어오기 전에 프로세스를 미리 만들어 두는 PREFORK 방식을 사용했다.
그래서 새로운 요청이 들어오면 미리 만들어둔 프로세스를 가져다 사용했다.
만약 만들어둔 프로세스가 모두 할당이 되면 추가로 프로세스를 만들었다.
1999년.
인터넷 사용자가 급격하게 늘어나면서, 이상한 문제가 생겨난다.
서버에 동시에 연결된 커넥션이 많아졌을 때, 더이상 커넥션이 형성되지 않는 문제가 생긴 것이다.
이를 C10K 문제라고 한다. (10000개의 Connection)
그 전에 두 용어의 차이점을 짚어보자.
동시에 연결된 커넥션 수 vs 초당 요청 처리 수
초당 요청 처리 수 : 서버가 얼마나 빨리 요청을 처리할 수 있는가 (RPS)
동시에 연결된 커넥션 수 : 요청을 처리하기 위해 한 시점에 서버가 얼마나 많은 클라이언트와 커넥션을 형성하고 있는가
한 클라이언트는 여러 개의 요청을 보낼 수 있고, 한 커넥션은 긴 시간 유지될 수 있기 때문에 이 두 지표는 같다고 볼 수 없다.
99년 당시에는 각 요청마다 매번 커넥션을 만들기엔 비효율적이고 시간도 느렸다.
그래서 사람들은 이미 만들어진 커넥션이 있다면 이를 재활용하자는 생각을 하게 된다.
http 프로토콜의 헤더 종류중에 keep-alive가 있다.
keep-alive에 있는 시간만큼 클라이언트와 서버는 커넥션을 유지하게 된다.
그런데 클라이언트 수가 늘어나면 그만큼 동시에 연결된 커넥션의 수도 늘어날거아냐.
이렇게 동시 연결된 커넥션 수가 만 단위를 넘어서는 순간, 서버는 더이상 커넥션을 형성하지 못하게 된다.
그런데 이 C10K 문제에서 하드웨어는 문제되는 것이 없었다.
이 당시 웹 페이지 용량 자체가 적었기 때문에 컴퓨터의 성능은 충분했다.
문제는 아파치 서버의 구조였다.
아파치 서버는 클라이언트가 늘어날 때마다 커넥션을 형성할 때마다 프로세스를 할당한다.
그렇기 때문에 동시에 처리하고 있는 커넥션이 많아지면 그만큼 형성되는 프로세스가 많다는 것이고,
이는 곧 메모리 부족 현상으로 이어진다.
설상 가상으로, 아파치 서버의 여러가지 기능을 쉽게 추가할 수 있는 특징은 프로세스가 차지하고 있는 리소스의 양을 늘렸다.
그리고 많은 커넥션에서 요청이 들어오기 시작하면, CPU 코어는 계속해서 프로세스를 바꿔가며 일을 해야 했다.
(Context Switching... 그만큼 CPU에 부하가 크게 걸린다.)
-> 결론적으로, 수 많은 동시 커넥션을 감당하기엔 아파치 서버의 구조가 적합하지 않았다.
그래서...
2004년에 아파치 서버의 단점을 보완하기 위한 새로운 소프트웨어가 나오게 된다.
"NGINX"
초기에는 아파치 서버를 완전히 대체하기 위한 것이 아니었다.
NGINX서버가 아파치 서버와 같이 쓰여서 부족한 점을 보완하기 위한 것이었다.
처음의 구조는 이랬다.
아파치 서버의 앞단에 nginx를 배치해서, 기존에 아파치 서버가 감당해야했던 수 많은 동시 커넥션을 nginx가 감당하게 하는 것이었다.
구조적으로 동시 커넥션을 많이 유지 못하는 아파치 서버의 부하를 nginx가 크게 줄일 수 있었다.
그리고 nginx는 그 자체로 웹서버다.
정적 파일 요청은 nginx가 처리할 수 있고, 클라이언트가 동적 파일 요청을 했을 때만 뒷단의 서버와 커넥션을 형성한다.
(아까 아파치 서버가 동적 파일도 처리할 수 있다고 했다... 처음 듣는 얘기지만...)
그래서 뒷단의 서버가 비즈니스 로직에만 집중할 수 있도록 도와준다.
이하 매우 중요한 내용들이 뒤에 나오는데, 다음에 한번 더 듣자.
https://pkeu.notion.site/pkeu/Nginx-ab4282c71ccb4efaaaadf840deb8c06a
ㄴ 웹서버가 동적 컨텐츠를 처리할 수 있다고?
-> 그렇다. CGI를 통해서 가능하다. 실제로 fastCGI라고 해서 지금도 쓰인다고 한다.
'Languages > Django' 카테고리의 다른 글
[아직 시작 안함] 자기소개 페이지 만들기 (0) | 2022.09.10 |
---|---|
[펌] VScode로 SSH를 통해 원격 서버에 접속하기 (0) | 2022.09.10 |
3티어 아키텍처와 프론트/백엔드의 차이 (0) | 2022.06.13 |
Project Overview (0) | 2022.06.13 |
형모가 알려준 Django overview (0) | 2022.06.08 |
최근댓글