Apach와 Nginx 이야기
- Nginx가 등장하기 전에는 Apach를 웹서버로 많이 사용하였지만 점차 늘어나는 트래픽을 감당하기 어려웠고
C10K(Connection 10000 Problem)
문제가 발생하였다. C10K
: 하나의 웹 서버에 1만개 이상의 클라이언트 접속을 처리하지 못하는 문제
- C10K 문제가 발생한 원인
- Pre-Fork 방식의 문제
- 메모리 낭비 심함
- 확장성이라는 장점이 프로세스 리소스 양을 늘려 무거움.
- 문맥교환 비용이 비쌈
apach (호환성과 확장성이 좋다)
- 특징
- prefork 방식
- 미리 프로세스 로드해놓는 방식
- 모듈 확장성이 좋다.
C10K 문제
-> 수많은 동시 커넥션을 유지하기엔 버거움.- 동시에 연결된 커넥션 수가 최대 만개 밖에 못한당.
- 하드웨어는 문제가 없없음.
- 문제점
- 커넥션 요청에 대한 많은
프로세스
(oom을 유발) - 아파치 확장성의 특징을 가지고 있지만 꽤나 리소스를 차지함.
- cpu 부하 (컨텍스트 스위칭 무거움..)
- [현 시점] MPM 모듈 방식을 제공
- 워커 쓰레드로 처리하는 방식, prefork 방식 중 선택해서 사용
nginx
(동시 커넥션 문제 해결!)
→ 동시 커넥션, 처리하는 초당 요청 수 도 월등 가벼움- 정적 파일 요청 스스로 처리
- Event Driven 구동 방식 (동작원리)
- master process - worker process
- listen 소켓 배정
- 하나만 담당하지 않는다
- 커넥션 생성, 제거, 새로운 요청을 처리하는 것을 이벤트라고 부름
- 이벤트는 큐에 담긴 상태에서 os 커널이 워커에게 전달함
- 비동기 방식으로 대기 하나의 스레드로 이벤트를 꺼내서 처리함
- 만약 이요청중 하나가 오래 걸린다면 (i/o)
- 따로 쓰레드 풀에 있던 걸로 처리
- 프로세스의 컨텍스트 스위칭을 대폭줄일 수 있다.
- 코어가 담당하는 프로세스를 바꾸는 횟수를 줄일 수 있다.
- cpu가 굳이 이런 부가적인 일을 하지 않아도 되는 거다

워커 프로세스는 cpu 코어 수만큼 생성

nginx 모듈을 만들기 까다롭다는 단점이 있다.
💨What
- 트래픽이 많은 웹사이트의 확정성을 위해 개발된 경량(가벼운 Context-Switching)의 고성능 웹서버(Event-Driven)이다.
- Nginx는 적은 자원의 사용으로 높은 성능과 높은 동시성을 목표로 만들어 졌다.
- 요청에 따른 메모리 사용량 비교

- 요청에 따른 처리량 비교

특징
- 하나의 워커 마다 초당 1000개의 request 수행할 수 있음
- 아파치와 달리 요청당 프로세스를 생성하지 않는다.
- CPU Core 수와 Worker Proceess 갯수가 같다
- 여러가지로 구성할 수 있다.
기능 제공
- 웹 서버
- 로드 벨런서
- SSL Termination ( 클라이언트와 https 통신, 서버와는 http 통신)
- 캐싱
- HTTP / 2
동작원리 (Master-Slave Architecture)

- Nginx는 Single Thead이므로 해당 Worker는 CPU core 수와 같다.
- 마스터 프로세스
- 워커 프로세스의 설정을 담당.
- 워커 프로세스
- 실제로 일을 하는 프로세스
- 생성될 때 마다, 각자 지정된 Listen 소켓을 배정받는다.
❓Why
웹 어플리케이션의 성능을 높이기 위해 사용해야한다.
- 쉬운 설치 및 유지보수
- 사용자 요청에 따른 응답시간 단축
- 부하 분산
- 확장성
📌 REFER
- 외국 사이트
- 한 사이트
Apach VS Nginx 비교 잘된 블로그
코기 동영상 정리
prefork, worker 방식
nginx reactor pattern
nginx official document