
아파치는 아파치 재단에서 만든 오픈 소스 프로젝트 형식의 가장 유명한 웹서버이다.
다양한 운영체제에서 사용될 수 있고, 주로 리눅스와 윈도우즈 운영체제에서 사용된다.
Apache는 Client 요청을 받을 시 MPM(Multi Processing Module : 다중처리모듈)이라는 방식으로 요청을 처리하며, 대표적으로 Prefork와 Worker방식이 존재한다.
Prefork MPM (Multy Processing Module) - 안정성 우선
새로운 HTTP 요청이 올 때마다 프로세스를 생성하여 각 프로세스에서 해당 요청을 처리한다.
프로세스를 생성하는 시간이 오래 걸리다 보니, 미리 만들어놓은 프로세스를 할당하는 방식인 Prefork 방식을 사용한다.
단일 스레드 방식으로 작동하여, 하나의 프로세스당 하나의 작업만 처리할 수 있다.
커넥션이 많아지면 많아질수록 프로세스의 수가 많아져 메모리 부족 현상, CPU 과부하 같은 문제들이 발생하여 커넥션을 더이상 생성하지 못하는 문제가 발생한다. (C10K 문제)
- C10K 문제
동시 커넥션 수가 10,000단위가 넘어가는 순간 서버는 더이상 커넥션을 형성하지 못하는 문제.
Worker MPM(Multy Processing Module) - 성능 향상 우선
출처 : https://old.zope.dev/Members/ike/Apache2/osx/configure_html
하나의 프로세스 내에서 여러 스레드를 생성하여, 여러 HTTP 요청을 처리할 수 있다.
쓰레드를 사용하기 때문에 쓰레드간의 메모리를 공유하며 Prefork 방식보다 메모리 소모가 적다.
하지만 이 방법도 커넥션이 많아질수록 프로세스와 스레드의 수가 많아져 메모리 부족현상, CPU 과부하 같은 문제들을 근본적으로 해결할 수는 없었다.
기존 아파치 서버의 구조적 한계로 인한 동시접속 문제를 해결하기 위해 나타난 웹 서버이다.
하지만 아파치 서버를 완전히 대체할 목적으로 만들어지지는 않았고, 함께 사용하기 위해 만들어졌다.
Ngin는 하나의 Master Process와 N개(보통은 cpu의 코어 개수)의 고정된 Worker Process로 구성되어 있는 Event 기반 구조를 가지고 있다.
Master Process의 주 역할은 설정 파일을 읽거나 검증하며 Worker Process를 관리하는 역할을 수행하고, Worker Process는 요청에 대한 실질적인 처리를 수행한다.
Nginx는 비동기 이벤트 기반 모델을 통해서 Worker Process 간에 요청을 효율적으로 분산하고, Event Driven 방식으로 동작한다.
- Event
Nginx에서는 커넥션을 형성/제거하거나 새로운 요청을 처리하는 것을 이벤트라고 칭한다.
출처 : https://www.youtube.com/watch?v=6FAwAXXj5N0
요청이 들어올 때마다 프로세스와 스레드를 생성하는 대신 고정된 프로세스와 스레드를 사용하여 메모리 부족과 CPU 과부하 문제를 해결할 수 있다.
동시 커넥션 양 최소 10배 증가 (일반적으로 100 ~ 1000배 증가)
동일한 커넥션 수일 때 속도 2배 향상
Nginx의 설정을 개발자가 동적으로 변경할 수 있다. (ex. nginx.conf 파일을 통해서 Worker Process의 수를 조절 등)
웹 서버 가속기 역할 수행
SSL 터미네이션 역할 수행
SSL 터미네이션은 클라이언트와는 https 통신을, 서버와는 http 통신을 하는 것을 의미한다.
보통 Nginx와 서버는 같은 네트워크 안에서 작동되기 때문에 보안 통신을 하지 않아도 보안에 큰 위험이 생기지 않는다.
캐싱
Nginx는 http 프로토콜을 사용하여 전달하는 컨텐츠를 캐싱할 수 있다. 한번 서버로부터 받은 응답을 보관하고 있다가 클라이언트에게 전달하게 된다.
캐싱을 하는 경우에는 Nginx를 클라이언트 네트워크와 근접하게 위치시킨다.
추가 참고 :
https://junghyungil.tistory.com/118
https://www.youtube.com/watch?v=6FAwAXXj5N0
https://willseungh0.tistory.com/137