누군가에게 Nginx를 왜 쓰며, 쓰지 않을 경우 어떻게 될까라는 질문을 받게 되었다. 그렇다.. 머리가 띵했다.
나름 왜?라는 자세로 공부를 하고 있었다 생각했는데 정작 Django(Python) 배포할 때부터 사용한 Nginx는 그냥 웹 서버라고만 알고 있었다. 그래서 오늘은 좀 더 자세하게 Nginx에 대해 파고들고자 한다.
Nginx란?
Nginx는 기본적으로 웹 서버로, HTTP 요청을 처리하고 클라이언트에게 웹 페이지나 파일 같은 정적 콘텐츠를 제공한다. 다음과 같이 클라이언트와 백엔드 서버(WAS, Database) 사이에 위치해 다양한 기능을 수행하는 게 핵심이다.
Client <-> Nginx(Web Server) <-> WAS <-> Database
웹 서버를 별도로 운영하는 이유
사실 저 로직에서 Web Server의 역할인 Nginx가 없어도 서버는 잘 동작할 것이다. 그렇다면 왜 Web Server를 사용할까?
주요 이유는 WAS의 부담을 줄여 서버 자원을 효율적으로 사용하기 위함이다. Nginx는 클라이언트의 정적 콘텐츠 요청을 먼저 처리하고, 동적 콘텐츠 요청만 WAS에 전달한다. 이렇게 하면 WAS가 주로 동적 처리에만 집중할 수 있어 성능을 최적화할 수 있다.
Nginx의 주요 기능과 장점
WAS의 부담을 줄이는 것 외에도 많은 장점이 있다. 대표 장점은 다음과 같다.
- 리버스 프록시 및 로드 밸런싱: 인터넷과 백엔드 사이에 위치한 서버로, 요청을 분산해 로드 밸런싱을 수행하고 WAS의 부하를 줄인다.
- 캐싱: 자주 요청되는 데이터를 캐싱하여 응답 속도를 높이고 서버 자원을 절약할 수 있다.
- SSL 지원 및 HTTPS 설정 용이: HTTPS 인증서를 제공하여 보안을 강화한다.
- 압축: gzip을 통해 Text 기반 파일(JSON 등)을 압축해 네트워크 사용량을 줄인다.
- 비동기 처리: 이벤트 루프 방식으로 비동기 처리를 하여 동시에 수많은 요청을 처리할 수 있다.
Apache와 Nginx의 차이
Web Server는 Nginx만 있나? 아니다. 정말 많은 종류가 있지만 사실상 대표적인 두 가지가 점유율을 차지하고 있다. Nginx와 Apache이다. 그렇다면 이 두 가지의 차이점은 무엇일까?
Nginx와 Apache는 모두 널리 사용되는 웹 서버지만, 구조에서 큰 차이가 있다.
Apache의 구조와 한계
Apache는 요청마다 새로운 프로세스를 생성해 커넥션을 형성한다. 이 구조는 동시 커넥션이 많아지면 메모리 부족과 프로세스 관리의 문제(CPU 컨텍스트 스위칭 문제)를 유발해 성능 저하를 초래한다. 이러한 문제는 C10K 문제(동시 10,000 커넥션 처리 한계)로 알려졌고, Nginx가 등장하게 된 배경이기도 하다.
Nginx의 구조
Nginx는 마스터 프로세스가 설정 파일을 읽고, 여러 개의 워커 프로세스를 생성하는 방식으로 동작한다. 각 워커 프로세스는 클라이언트 요청을 비동기로 처리하며, 이벤트 기반 구조를 채택해 CPU의 컨텍스트 스위칭을 줄인다. 이러한 구조는 동시 커넥션 처리 능력을 크게 향상시켜 Apache보다 효율적인 성능을 제공한다.
Nginx의 이벤트 기반 구조
Nginx는 마스터 프로세스와 워커 프로세스 구조로 작동한다.
- 마스터 프로세스: 설정 파일을 읽고, 설정에 따라 워커 프로세스를 생성한다.
- 워커 프로세스: 실제 클라이언트 요청을 처리하는 프로세스이다. 각 워커 프로세스는 지정된 소켓을 할당받아 클라이언트와 커넥션을 형성하고, 요청을 처리한다.
- 커넥션 형성, 커넥션 제거, 새로운 요청 처리를 이벤트라고 한다.
- 이러한 이벤트는 OS 커널에서 큐 형식으로 워커 프로세스에 전달된다.
- 워커 프로세스는 이벤트를 비동기로 대기하며, 처리할 준비가 되면 하나의 스레드가 이벤트를 꺼내 처리한다.
- 멀티 프로세싱: CPU 코어 수에 맞춰 생성된 여러 워커 프로세스가 병렬로 작동하여 요청을 비동기로 처리한다. 각 워커 프로세스가 독립적으로 작동하므로, CPU 자원을 효율적으로 사용할 수 있다.
- 스레드 풀: 오래 걸리는 작업은 별도의 스레드 풀에서 처리하여 워커 프로세스의 블로킹을 방지하고, 요청을 빠르게 이어서 처리할 수 있다.
이 구조는 워커 프로세스가 쉬지 않고 계속 일을 할 수 있게 해 주며, 요청이 없을 때 자원이 방치되는 Apache와 달리 효율적으로 서버 자원을 사용할 수 있다. 즉, 비동기 이벤트 기반 처리는 Nginx가 동시에 많은 커넥션을 유지하고, 높은 효율성을 유지할 수 있는 중요한 이유이다.
Nginx 단점
대표적으로 모듈 확장이 까다롭다는 점이 있지만, 높은 동시 커넥션 처리 능력과 효율성 덕분에 여전히 많이 사용됩니다.
Nginx와 Spring Boot
이 글을 쓰게 된 원초적인 이유였다. Spring Boot로 API를 개발할 때 Tomcat 같은 WAS가 동작한다. 그렇다면 Nginx가 없다면 어떻게 될까?
Nginx 없이 Spring Boot를 실행시킬 경우, 기본적으로 Spring Boot의 내장 WAS(Tomcat 등)를 통해 웹 애플리케이션이 구동되므로 서비스는 정상적으로 작동할 수 있다. 하지만 Nginx가 없을 때는 다음과 같은 제한과 단점이 발생할 수 있다:
- 성능 및 효율성 저하: Nginx는 클라이언트의 정적 콘텐츠 요청을 처리하고, WAS에 동적 콘텐츠 요청만 전달함으로써 WAS의 부하를 줄인다. Nginx 없이 Spring Boot를 실행하면 모든 요청을 WAS가 직접 처리해야 하므로 서버 자원의 효율성이 떨어진다.
- 동시 요청 처리 한계: Nginx는 이벤트 기반 비동기 구조를 사용해 대량의 동시 요청을 효율적으로 처리할 수 있다. 반면, Spring Boot의 내장 WAS는 이 부분에서 제한적이며, 높은 트래픽 환경에서는 성능 저하가 더 두드러진다.
- 로드 밸런싱 불가: 여러 WAS 인스턴스로 요청을 분산 처리하려면 Nginx와 같은 로드 밸런서를 통해 요청을 효과적으로 나눠줘야 한다. Nginx 없이 Spring Boot 단독으로 실행하면 로드 밸런싱을 구현하기 어렵고, 이는 서버 확장성과 안정성에 영향을 줄 수 있다.
- SSL 설정 복잡성: Nginx는 HTTPS 인증서를 쉽게 설정할 수 있어 보안 강화에 유리하다. Nginx 없이 Spring Boot에서 직접 SSL을 설정하려면 더 복잡한 설정이 필요하며, 인증서 관리가 어려워질 수 있다.
- 캐싱 기능 부족: Nginx는 자주 요청되는 데이터나 정적 콘텐츠를 캐싱해 서버 응답 속도를 높이고 네트워크 사용량을 줄여준다. Spring Boot만으로는 이와 같은 캐싱 기능을 효과적으로 수행하기 어렵다.
- 보안 설정 한계: Nginx는 리버스 프록시를 통해 웹 애플리케이션의 보안을 강화하고, 서버와 클라이언트 간의 민감한 정보를 보호할 수 있다. Nginx 없이 Spring Boot를 실행할 경우 WAS가 외부 네트워크에 직접 노출되므로 보안 설정이 한정적이다.
결론
Nginx는 그 자체로 빠르고 효율적인 고성능 웹 서버로, Apache보다 동시 커넥션 처리와 서버 자원 효율성에서 우수하다. 이벤트 기반 비동기 처리 구조를 통해 서버 자원의 최적화를 가능하게 하며, 로드 밸런싱, 보안, 캐싱 등의 다양한 기능을 제공해 기존 WAS를 보완하여 웹 서비스의 성능과 안정성을 높일 수 있다. 이러한 구조적 강점 덕분에 Nginx는 많은 개발자가 선택하는 웹 서버로 자리 잡고 있다.
물론 Apache가 성능이 좋지 않다는 것이 아니다. 이 글은 Nginx를 중점으로 쓴 글이기 때문에 가려졌지만 호환성이나 확장성 측면에서는 더 우수할뿐더러 MPM(Multi Processing Modlues, 아파치 서버를 어떤 방식으로 운영할지 선택할 수 있는 모듈) 모듈을 추가해서 성능을 개선했다.
어디에나 장점과 단점은 있고, 정해진 답은 없으니 각 상황에 맞는 서버를 사용하면 될 것 같다. 이 또한 무엇을 사용했나 보다 왜 사용했는가가 더 중요하지 않을까.. 싶다.
'Infra' 카테고리의 다른 글
[Infra] AWS ECS란? (1) | 2025.03.25 |
---|---|
[Infra] AWS 인프라 입문 (VPC, Subnet, Route Table, NAT Gateway, AZ..) (0) | 2025.03.05 |