![Nginx 쉬운 이해하기](/github-blog//assets/img/woowacourse.png)
Nginx 쉬운 이해하기
이벤트 기반 구조로 웹 서버 역할을 수행하는 프로그램이다.
- 웹 서버, 리버스 프록시, 로드 밸런서, HTTP 캐시의 역할이 가능하다.
이벤트 기반 구조?
어떤 일에 대한 반응(이벤트)으로 동작하는 것이라고 생각한다.
이벤트 기반은 programming, architecture 등과 연결되어 다양한 정의로 표현된다.
쓰레드 기반은 하나의 쓰레드에 하나의 요청을 처리하지만 이벤트 기반 구조는 여러 커넥션을 event-handler 에서 비동기 방식으로 먼저 처리되는 것부터 로직이 수행되도록 한다.
Apache
아파치는 새로운 요청이 오면 커넥션을 형성하기 위해 프로세스를 생성한다. PRE FOKL 로 미리 만들어둔 프로세스를 제공하고 만약 모두 소진되면 추가로 프로세스를 만들었다.
개발하기 쉽다는 장점이 있다. 다양한 모듈을 만들어서 서버에 빠르게 기능을 추가할 수 있었다.
아파치 동적컨텐츠를 처리할 수 있다. 확장성이 좋다. 하나의 서버에서 요청 응답/처리가 가능했다.
장점
모듈 확장이 쉽다.
다양한 OS 에서 안정적으로 동작한다.
문제 봉착
인터넷이 보급되면서 동시 요청이 많아지게 되면서 더이상 커넥션을 만들어내지 못하는 상황(C10K)에 처한다.
Keep-alive 헤더를 통해 한 번 생성된 커넥션을 유지시키고(time-out 전까지) 재사용하고자 했다.
동시 커넥션이 만단위를 넘어가자 더이상 커넥션을 생성할 수 없었다. 수많은 컨텍스트 스위칭을 처리하기에는 CPU 의 능력으로 역부족이었다.
등장
아파치 서버를 보완하기 위해 2004년에 등장했다. 아파치 서버와 함께 사용하기 위해 나왔다. 아파치 서버의 구조적문제를 Nginx 가 보완하려고 했다.
아파치 앞단에 Nginx 를 위치시켜 정적파일을 Nginx 에서 처리시켰다. 아파치는 동적파일처리에만 사용하면서 아파치 서버의 리소스를 커넥션 처리에 사용하지 않고 개발자가 원하는 로직 처리에 사용하도록 했다.
이벤트
이벤트란?
- 요청 처리
- 커넥션 형성
- 커넥션 제거 등
이벤트 처리과정
- 이벤트들은 OS 커널이 Queue 형식으로 각각의 워커 프로세스에 전달해준다.
- 전달된 이벤트들은 큐에 담긴상태에서 워커 프로세스가 처리해줄 때까지 비동기 방식으로 대기한다.
- 워커 프로세스는 하나의 스레드로 이벤트를 꺼내서 처리해간다.
덕분에 적은 수의 워크프로세스가 쉬지않고 일한다는 장점이 있다. 아파치는 PRE-FORKED 방식이기 때문에 요청이 없으면 프로세스가 방치된다는 단점이 있다.
Nginx 는 오래걸리는 이벤트를 감지하면 따로 처리하는 스레드 풀로 보내서 그곳에서 처리하도록 하고 다음 이벤트를 처리한다.
워커 프로세스는 보통 CPU 코어 수만큼 생성한다. 이로 인해 컨텍스트 스위칭으로 인한 오버헤드가 대폭 감소한다. 이것이 바로 Nginx 가 채택한 이벤트 기반 구조(Event-Driven-Model)다.
장점
동시 커넥션 양 최소 10배 증가 (일반적으로 100 ~ 1000 배 증가)
동일한 커넥션 수일 때 속도 2배 증가
동적 설정이 가능하다.
- 개발자가 Nginx 설정을 적용하면 마스터 프로세스는 해당 설정에 맞게 워커 프로세스를 따로 생성한다.
- 기존 워커 프로세스는 더 이상 커넥션을 생성하지 않도록 한다.
- ex) WAS 서버가 추가될 때 Nginx 는 로드밸런서의 역할을 한다. 이때 새로운 서버의 설정을 추가해야할 때, 동적으로 변경하면 웹 서버를 종료하지 않고 적용할 수 있다.
단점
개발자가 기능을 추가하려다가 워커 프로세스를 건드려서 종료시키는 상황이 발생할 수 있다. 그리되면 워커 프로세스에서 처리하던 커넥션과 요청을 더 이상 처리할 수 없다.