Nginx 왜 궁금했을까❓
뉴스타 프로젝트에서 인프라 구축을 담당하여 Reverse Proxy, SSL, LoadBalancing 등의 장점이 있는 Nginx를 활용해 보기로 했다. 해당 포스트를 통해 Apache Server와 Nginx의 동작 원리와 차이점을 알아보도록 하겠다.
1. Web Server란?
- 정적 콘텐츠를 요청한 클라이언트에게 제공하는 역할
- html, css, 이미지 등이 정적 콘텐츠에 해당
- 사용자가 정적 콘텐츠를 요청하면 Web Server가 DB에서 파일을 읽어와 그대로 사용자에게 반환하는 로직이다.
- 만약, 비즈니스 로직이 요구되며 WAS를 추가하여 동적으로 데이터를 처리할 수 있게 된다.
1.1. Web Server의 역할
위와 같은 이유로 Web Server와 WAS를 함께 사용하는데 Web Server는 어떤 역할을 하는지 상세하게 알아보자.
- 성능 향상 - 웹 서버는 정적 콘텐츠를 처리하는데 최적화되어 있어 서비스 전체의 성능을 향상시킬 수 있다.
- 캐싱 및 압축 - 정적 리소스에 대한 요청을 캐싱하고 압축하여 응답 속도를 향상시키고 네트워크 대역폭 사용을 줄일 수 있다.
- 로드 밸런싱 - 다수의 WAS가 배포되어 있는 경우 각 서버에 분산시켜 서버 부하를 줄임으로써 서비스 전체의 처리량을 높이고 가용성을 향상시킨다.
- 보안 - Reverse Proxy, DMZ 역할을 통해 내·외부 네트워크를 격리시켜 WAS에 직접 접근하는 것을 방지하고 SSL을 적용하여 보안을 강화할 수 있다.
2. Apache Server / Nginx
Web Server에는 대표적으로 Apache Server와 Nginx가 존재한다.
2.1. Apache Server 동작 원리
- Apache는 새로운 사용자로부터 요청이 오면 Connection을 형성하기 위해 프로세스를 생성한다.
- 새로운 요청마다 프로세스를 생성하기 때문에 효율성이 떨어져 Prefork 방식을 채택했다.
- 미리 응답 프로세스를 만들어놓고 사용자 요청이 오면 해당 프로세스를 할당하는 방식이다.
2.2. Apache Server의 한계
- 단말기 수가 증가하면서 Apache Sever에 많은 사용자가 요청을 보내게 되었고 다량의 Connection 형성이 필요했다.
- Connection 형성을 위해서는 프로세스를 생성해야 해서 프로세스 생성 비용이 증가하고 CPU/메모리 사용 또한 증가하는 문제점이 있었다.
- 이로 인해, 10,000개 이상의 Connection이 형성되면 서버가 더 이상 Connection을 형성하지 못하는 문제점이 발생하게 되었고 이를 C10K(Connection 10000 Problem)라고 지칭했다고 한다.
- 이러한 구조적 한계를 극복하기 위해 나온 것이 Nginx이다.
2.3. Nginx를 통한 C10K 해결
- 위 그림처럼 많은 사용자 Connection을 Nginx가 유지하는데 정적 콘텐츠의 경우 Nginx가 처리하게 된다.
- 하지만, 동적 콘텐츠에 대한 요청이 오면 Apache 서버와 Connection을 형성하여 처리함으로써 Apache 서버의 부하를 줄인다.
- 이처럼 초창기 Nginx는 C10K 문제를 해결하기 위해 Apache Sever와 함께 사용했다.
2.4. Nginx 동작 원리
- Nginx는 Master Process를 통해 실제 사용자 요청을 처리하는 Worker Process를 생성한다.
- Worker Process가 생성될 때, 지정된 Listen 소켓을 배정받으며 해당 소켓에 새로운 사용자 요청이 오면 Connection을 형성하고 처리한다.
- Connection은 지정한 Keep-Alive 시간만큼 유지되며 Worker Process는 여러 개의 Connection을 처리할 수 있다.
- 만약, 형성된 Connection으로부터 요청이 없다면 새로운 Connection을 형성하거나 이미 존재하는 Connection으로부터 오는 요청을 처리한다.
- 이처럼 Connection 형성, 제거, 처리되는 것을 Event라고 부른다.
- Event들은 OS 커널이 Queue 형식으로 Worker Process에게 전달하며 비동기 상태로 대기한다.
- Worker Process는 하나의 스레드로 Event를 꺼내서 처리하는데 이러한 방식은 Worker Process가 쉬지 않고 요청을 처리하기 때문에 요청이 없을 때 프로세스를 방치시키는 Apache Server보다 효율성이 높다.
- Apache Server 방식은 하나의 Connection당 하나의 Thread를 사용한다.
- 하지만, Nginx의 경우 여러 개의 Connection을 Event Handler를 통해 비동기 방식으로 처리하여 효율적으로 처리할 수 있다.
2.5. Nginx의 장단점
1. 성능 향상
- 비동기 이벤트 기반 구조를 사용하여 빠르고 효율적인 Web Server 기능을 제공
- 프로세스 간의 Blocking을 최소화하고 동시에 많은 요청을 처리할 수 있어 큰 트래픽에 대한 처리가 탁월
2. Reverse Proxy
- 클라이언트의 요청을 대신 받아서 내부 서버로 전달하는 것을 Reverse Proxy라고 한다.
- Nginx를 Reverse Proxy로 구성하면 Proxy Server인 Nginx의 주소만 노출되고 내부 서버를 감추게 되어 보안성을 향상시킬 수 있다.
3. Load-Balancing
- 다수의 서버에 트래픽을 분산시켜 서버의 부하를 감소시킬 수 있다.
- 사용자의 요청이 오면 Nginx는 라운드로빈 방식으로 요청을 분산시켜 서버에게 할당한다.
4. 동적 컨텐츠 처리 한계점
- Nginx는 정적 콘텐츠 처리에 최적화되어 있기 때문에 동적 컨텐츠 처리에 한계가 존재한다.
- 하지만, WAS에 API를 전달하여 동적 컨텐츠를 처리함으로써 한계를 극복할 수 있다.