Tomcat / NginX

2coconut·2025년 7월 10일

웹 개발을 하다 보면 Tomcat과 NginX라는 용어를 자주 접하게 된다. 둘 다 웹과 관련된 서버 소프트웨어이지만, 각각의 역할과 특징이 완전히 다르다. 오늘은 이 두 가지를 명확히 구분하고, 언제 어떻게 사용해야 하는지 알아보자.

기본 개념부터 이해하기

웹 서버 vs WAS

먼저 웹 서버와 WAS(Web Application Server)의 차이를 이해해야 한다.

웹 서버는 정적 파일(HTML, CSS, 이미지 등)을 클라이언트에게 제공하는 소프트웨어다. 클라이언트의 HTTP 요청을 받아서 이미 만들어진 파일을 그대로 전송하는 역할을 한다.

WAS는 동적 컨텐츠를 생성할 수 있는 서버다. 데이터베이스 조회, 비즈니스 로직 처리 등을 통해 요청에 따라 다른 결과를 만들어내는 역할을 한다. WAS는 웹 서버의 기능도 포함하고 있어 정적 파일도 제공할 수 있다.

WAS의 주요 특징

  • 웹 서버 + 웹 컨테이너: 정적 파일 제공과 동적 컨텐츠 생성을 모두 담당
  • 데이터베이스 연동: JDBC 등을 통한 데이터베이스 접근 및 트랜잭션 처리
  • 비즈니스 로직 처리: 복잡한 애플리케이션 로직 실행
  • 세션 관리: 사용자 세션 생성, 유지, 제거
  • 보안 처리: 인증, 권한 부여 등의 보안 기능
JDBC - Java 프로그램에서 데이터베이스에 접속하고, 데이터를 관리하기 위한 자바 API

웹 서버와 WAS를 분리하는 이유

WAS가 웹 서버 기능을 포함하고 있음에도 불구하고 둘을 분리해서 사용하는 이유는 다음과 같다

1. 서버 부하 방지
WAS가 정적 파일까지 처리하면 동적 처리에 필요한 리소스가 부족해져 전체적인 성능이 저하된다.

2. 장애 극복(Failover)
웹 서버는 상대적으로 안정적이지만 WAS는 복잡한 로직 처리로 인해 장애가 발생하기 쉽다. 분리하면 WAS 장애 시에도 웹 서버가 오류 페이지를 제공할 수 있다.

3. 효율적인 리소스 관리
정적 컨텐츠가 많으면 웹 서버를 증설하고, 동적 처리가 많으면 WAS를 증설하는 식으로 선택적 확장이 가능하다.


NginX - 고성능 웹 서버

NginX란?

NginX(엔진엑스)는 가볍고 빠른 웹 서버다. 2004년에 등장했으며, 특히 대용량 트래픽을 효율적으로 처리하는 것으로 유명하다.

NginX의 핵심 특징

1. 이벤트 기반 아키텍처

NginX는 이벤트 기반(Event-Driven) 방식을 사용한다. 하나의 워커 프로세스가 수천 개의 동시 연결을 처리할 수 있어, 메모리 사용량이 적고 성능이 뛰어나다.

2. 비동기 I/O 처리

전통적인 서버와 달리 NginX는 비동기 방식으로 동작하여, 한 요청을 처리하는 동안에도 다른 요청들을 동시에 처리할 수 있다. 이로 인해 블로킹 없이 높은 동시성을 제공한다.

3. 리버스 프록시 기능

NginX는 단순히 정적 파일만 제공하는 것이 아니라, 리버스 프록시 역할도 할 수 있다. 클라이언트와 백엔드 서버 사이에서 중재자 역할을 하여 다음과 같은 이점을 제공한다:

  • 로드 밸런싱: 여러 백엔드 서버에 요청을 분산시켜 부하를 분산
  • SSL 처리: HTTPS 암호화/복호화를 대신 처리하여 백엔드 서버 부담 감소
  • 캐싱: 자주 요청되는 내용을 메모리에 저장해 빠른 응답 제공
  • 보안: 백엔드 서버의 IP를 숨겨 보안 강화

4. 낮은 리소스 사용량

적은 메모리와 CPU로도 대용량 트래픽을 처리할 수 있어, 비용 효율적인 서버 운영이 가능하다.

이벤트 기반 (Event-Driven): 요청이 들어올 때마다 새로운 프로세스/스레드를 만들지 않고, 하나의 프로세스가 여러 요청을 순차적으로 처리하는 방식
리버스 프록시 (Reverse Proxy): 클라이언트와 실제 서버 사이에 위치해서 클라이언트 요청을 받아 대신 서버에 전달하고 응답을 돌려주는 중간 서버
비동기 I/O: 파일 읽기나 네트워크 통신 같은 작업을 요청한 후 완료될 때까지 기다리지 않고 다른 작업을 계속 처리하는 방식
로드 밸런싱 (Load Balancing): 여러 서버에 들어오는 요청을 골고루 분산시켜서 특정 서버에만 부하가 몰리지 않도록 하는 기술
서블릿 컨테이너 (Servlet Container): Java로 작성된 웹 애플리케이션 코드를 실행하고 관리해주는 실행 환경

NginX의 탄생 배경

1990년대 말, 인터넷 사용자가 급증하면서 C10K 문제가 대두되었다. 이는 동시 접속자 1만 명을 처리할 수 없는 웹 서버의 한계를 의미한다.

러시아의 개발자 Igor Sysoev는 대형 포털 사이트 Rambler.ru에서 일하면서 Apache 서버의 성능 한계를 직접 경험했다. 이를 해결하기 위해 2002년부터 새로운 웹 서버 개발을 시작했고, 2004년 NginX를 공개했다.

NginX는 이벤트 기반 아키텍처로 Apache의 메모리 사용량과 동시 접속 처리 한계를 혁신적으로 개선했다.

NginX의 등장 배경 - Apache의 한계

NginX가 등장하기 전에는 Apache HTTP Server가 가장 인기 있는 웹 서버였다. Apache는 다음과 같은 방식으로 동작했다

  • 프로세스/스레드 기반: 요청마다 새로운 프로세스나 스레드 생성
  • 미리 생성된 프로세스 활용: 성능 향상을 위해 미리 프로세스들을 생성해 놓음
  • 확장성의 장점: 모듈 개발이 쉽고 유연한 구조

하지만 인터넷 사용자가 급증하면서 C10K 문제가 발생했다. 이는 동시 접속자 1만 명(10,000 Connection)을 처리할 수 없는 문제를 의미한다. Apache의 구조적 한계였다

  • 메모리 사용량 급증: 접속자마다 프로세스/스레드 생성으로 메모리 부족
  • 컨텍스트 스위칭 오버헤드: 프로세스 간 전환 비용 증가
  • 확장성 한계: 동시 접속자 수 증가에 따른 성능 급격한 저하

2004년, 이러한 Apache의 한계를 극복하기 위해 Igor Sysoev가 NginX를 개발했다.


NginX의 내부 구조

NginX는 마스터 프로세스(Master Process)워커 프로세스(Worker Process)로 구성된다.

마스터 프로세스의 역할:

  • 설정 파일 읽기 및 검증
  • 워커 프로세스 생성 및 관리
  • 신호 처리 (재시작, 종료 등)

워커 프로세스의 역할:

  • 실제 클라이언트 요청 처리
  • 보통 CPU 코어 수만큼 생성 (컨텍스트 스위칭 최소화)
  • 각각 독립적으로 수천 개의 연결 처리

이벤트 처리 방식:
1. 클라이언트 연결, 요청 처리, 응답 등을 모두 이벤트로 취급
2. 이벤트들을 큐(Queue)에 담아서 순서대로 처리
3. 비동기 방식으로 대기 - 블로킹되지 않음
4. 하나의 스레드로 여러 이벤트를 순차적으로 처리

비동기 처리의 핵심 장점

전통적인 서버는 하나의 요청을 완전히 처리할 때까지 대기해야 했다. 예를 들어, 파일을 읽거나 데이터베이스에 쿼리를 보내는 동안 해당 스레드는 응답을 기다리며 아무것도 할 수 없었다.

하지만 NginX는 비동기 I/O 처리 방식을 사용한다:

  • 파일 읽기나 네트워크 통신 요청 후 완료를 기다리지 않음
  • 대기 시간 동안 다른 요청들을 계속 처리
  • 작업이 완료되면 이벤트로 알림받아 결과 처리

이러한 구조로 인해 NginX는 적은 리소스로도 많은 동시 접속을 처리할 수 있다.

리버스 프록시 기능

NginX는 단순히 정적 파일만 제공하는 것이 아니라, 리버스 프록시 역할도 할 수 있다. 클라이언트와 백엔드 서버 사이에서 중재자 역할을 하여 다음과 같은 이점을 제공한다:

  • 로드 밸런싱: 여러 백엔드 서버에 요청을 분산시켜 부하를 분산
  • SSL 처리: HTTPS 암호화/복호화를 대신 처리하여 백엔드 서버 부담 감소
  • 캐싱: 자주 요청되는 내용을 메모리에 저장해 빠른 응답 제공
  • 보안: 백엔드 서버의 IP를 숨겨 보안 강화

NginX의 장점

  • 낮은 메모리 사용량으로 높은 성능 제공
  • 수만 개의 동시 접속 처리 가능
  • 설정이 간단하고 직관적
  • 리버스 프록시, 로드 밸런서로 활용 가능
  • 빠른 정적 파일 제공

NginX의 단점

  • 동적 컨텐츠 처리를 위해서는 별도의 WAS 필요
  • 복잡한 프로그래밍 로직 처리 불가
  • 모듈 추가 시 재컴파일 필요 (일부 경우)

Tomcat - Java 웹 애플리케이션 서버

Tomcat이란?

Tomcat은 Java 서블릿과 JSP를 실행할 수 있는 웹 애플리케이션 서버(WAS)다. Java 웹 애플리케이션을 실행하는 표준 컨테이너 역할을 한다.

Tomcat의 핵심 특징

1. 서블릿 컨테이너

Tomcat의 핵심은 서블릿 컨테이너 기능이다. Java 서블릿과 JSP를 실행하고 관리하는 환경을 제공한다. Spring Boot 애플리케이션도 내장 Tomcat을 사용하여 실행된다.

2. 생명주기 관리

웹 애플리케이션의 생명주기를 관리한다. 애플리케이션 시작, 정지, 재시작 등을 담당하며, 메모리 관리와 세션 관리도 수행한다.

3. Java EE 표준 지원

Java Enterprise Edition의 표준 스펙을 따르므로, 다른 Java 웹 프레임워크들과 호환성이 뛰어나다.

4. 멀티스레딩

각 HTTP 요청을 별도의 스레드에서 처리한다. 스레드 풀을 사용하여 동시에 여러 요청을 처리할 수 있다.

Tomcat의 동작 방식

  1. 클라이언트가 HTTP 요청을 보냄
  2. Tomcat이 요청을 받아 적절한 서블릿에 전달
  3. 서블릿이 비즈니스 로직을 처리 (데이터베이스 조회 등)
  4. 처리 결과를 HTTP 응답으로 클라이언트에게 전송

Tomcat의 장점

  • Java 웹 애플리케이션 표준 실행 환경
  • Spring, Struts 등 다양한 Java 프레임워크 지원
  • 풍부한 문서와 커뮤니티 지원
  • 무료 오픈소스
  • 설정과 관리가 상대적으로 간단

Tomcat의 디렉터리 구조

Tomcat을 설치하면 다음과 같은 주요 디렉터리들이 생성된다:

tomcat/
├── bin/          # 실행 파일 및 스크립트
│   ├── startup.sh   # 시작 스크립트
│   ├── shutdown.sh  # 종료 스크립트
│   └── catalina.sh  # 메인 실행 스크립트
├── conf/         # 설정 파일
│   ├── server.xml   # 서버 전체 설정
│   ├── web.xml      # 웹 애플리케이션 기본 설정
│   └── context.xml  # 컨텍스트 설정
├── lib/          # Tomcat 라이브러리
├── logs/         # 로그 파일
├── temp/         # 임시 파일
├── webapps/      # 웹 애플리케이션 배포 디렉터리
│   ├── ROOT/       # 기본 웹 애플리케이션
│   ├── manager/    # 관리자 앱
│   └── docs/       # 문서
└── work/         # JSP 컴파일된 파일

주요 디렉터리 설명:

  • webapps/: WAR 파일을 이곳에 배포하면 자동으로 압축 해제되어 실행
  • conf/server.xml: 포트, 커넥터, 호스트 등 서버의 핵심 설정
  • logs/: catalina.out, access.log 등 다양한 로그 파일 저장

NginX vs Tomcat 비교

구분NginXTomcat
유형웹 서버WAS (웹 애플리케이션 서버)
주요 용도정적 파일 제공, 리버스 프록시Java 웹 애플리케이션 실행
언어 지원다양한 언어 (프록시를 통해)주로 Java
성능높은 동시 접속 처리Java 애플리케이션 처리에 최적화
메모리 사용매우 낮음상대적으로 높음
정적 파일매우 빠름상대적으로 느림
동적 컨텐츠불가 (프록시 필요)가능
설정 복잡도간단중간
확장성이벤트 기반으로 뛰어남스레드 기반으로 제한적
profile
컴공학생

0개의 댓글