Nginx
Nginx
Nginx란 웹 서버 소프트웨어로, 가벼움과 높은 성능을 목표로 한다. 웹 서버, 리버스 프록시 및 메일 프록시 기능을 한다.
Nginx는 요청에 응답하기 위해 비동기 이벤트 기반 구조를 가진다. 이는 아파치 HTTP 서버의 스레드/프로세스 기반 구조를 가지는 것과 대조적이다. 비동기 이벤트 구조는 서버에 많은 부하가 생길 경우 성능 예측이 용이하다.
참고 - 위키
APACHE (1995년 등장)
- 아파치 서버는 요청이 들어올 때마다 프로세스를 만든다.
- 프로세스를 만드는 작업이 시간이 오래 걸리기 때문에 요청이 들어오기 전에 프로세스들을 미리 생성하는 Prefork 방식을 사용한다.
- 새로운 요청이 들어오면 미리 만들어 놓은 프로세스를 할당
- 미리 만든 프로세스가 모두 할당되면 새로운 프로세스를 만든다.
- 이러한 구조는 개발하기 쉽고 확장성이 좋다는 장점이 있다.
APACHE 한계
- 시대가 지날 수록 사용자 요청이 점점 늘어나고 아파치 서버가 모든 요청에 프로세스를 할당하지 못하게 되어 새로운 커넥션을 만들지 못하게 되었다.
- C10K 문제 - Connection 10,000개 문제
- 사용자는 한 번 커넥션이 연결되면 연결을 유지하면서 여러 요청을 보낸다. (keep-alive)
- 프로세스를 만드는 작업은 무겁다. → 메모리 부족
- 아파치의 장점이었던 기능 추가의 용이성은 프로세스의 리소스 할당을 늘렸다.
- 잦은 컨텍스트 스위칭으로 CPU 부하가 커진다.
- 즉 수많은 동시 커넥션을 감당하기엔 아파치 서버는 적합하지 않았다.
Nginx의 등장 (2004년)
- 아파치 서버를 보완하기 위해 nginx가 등장한다.
- 초창기엔 아파치 서버의 구조적 한계를 nginx 함께 사용해 극복하고자 했다.
- 아파치 서버 앞에 nginx를 배치하여 수많은 동시 커넥션을 nginx가 감당하게 했다.
- nginx는 웹서버이기 때문에 정적 파일은 자신이 사용자 요청에 응답하고, 동적 요청에 대해서만 아파치 서버로 커넥션을 연결한다.
- nginx는 어떻게 수많은 동시 커넥션을 처리할 수 있을까?
Nginx 구조
- 비결은 만들어지는 프로세스 수에 있다.
- Master process
- 설정 파일을 읽고, 설정에 맞게 worker process를 생성하는 프로세스
- worker process는 master process의 자식 프로세스이다.
- Worker process
- 실제로 일을 하는 프로세스
- 만들어질 때 각자 정해진 Listen 소켓을 할당 받는다.
- 그 소켓에 새로운 사용자 요청이 들어오면 커넥션을 생성하고 요청을 처리한다.
- 이 커넥션은 정해진 keep-alive 시간만큼 유지된다.
- 그런데 한 커넥션에 대해서만 담당하지는 않는다.
- 형성된 커넥션에 아무런 요청이 없으면 새로운 커넥션을 형성하거나 전에 연결된 커넥션에 대한 새 요청을 처리하기도 한다.
- nginx에선 이러한 커넥션 형성, 제거, 요청 처리를 이벤트라고 부르고 이 이벤트들은 OS 커널이 큐 형식으로 워커 프로세스에게 전달한다.
- 이벤트들은 워커 프로세스가 처리할 때까지 비동기 방식으로 대기한다.
- 워커 프로세스는 하나의 스레드로 큐의 이벤트들을 처리해 나간다.
- 즉 연결은 유지되지만 요청이 없어 프로세스를 낭비하던 아파치 서버와 달리 nginx의 워커 프로세스는 쉬지 않고 여러 일을 하면서 메모리 부족 문제를 해결한다.
- 워커 프로세스는 CPU 코어 개수만큼 생성된다.
- 코어가 프로세스를 변경하는 작업을 대폭 줄일 수 있다. (CPU 과부하 해결)
- 이벤트 기반 구조
- 개발자가 기능을 추가하기 어렵다는 단점이 있다. (워커 프로세스를 종료해버릴 수 있음)
- 하지만 동시 커넥션 양 최소 10배 증가, 동일한 커넥션 수일 때 속도 2배 향상 등 장점이 강력하다.
동적 설정 변경에 용이
- 프로세스를 적게 만드는 nginx의 구조는 동적 설정 변경에 용이하다.
- 개발자가 설정 파일을 변경하고 적용하면 마스터 프로세스는 그 설정에 맞는 워커 프로세스를 따로 설정한다.
- 그리고 기존에 있던 워커 프로세스가 커넥션을 더 이상 생성하지 않도록 한다.
- 기존 워커 프로세스가 담당하던 이벤트가 모두 처리되면 해당 프로세스를 종료한다. (새로운 설정의 워커 프로세스로의 전환이 용이)
- 동적으로 설정을 변경할 수 있는 nginx는 서버를 추가하여 로드 밸런서로서의 역할을 할 수 있게 된다.
Nginx 사용처
- 웹 서버 가속기로서의 nginx
- 정적 파일 처리
- 로드 밸런서
- SSL 터미네이션
- Nginx가 클라이언트와는 HTTPS 통신을 하고, 뒷단의 서버와는 HTTP 통신을 하는 방식
- 보통 nginx와 서버는 같은 네트워크 안에서 통신하기 때문에 HTTP 통신으로도 충분
- 캐싱
- HSTS (HTTP Strict Transport Security)
- CORS 처리
- TCP/UDP 커넥션 부하 분산
- HTTP/2
- …
참고
https://youtu.be/6FAwAXXj5N0