한 도구가 여러 책임을 흡수하는 경우가 많아 웹 서버(Web Server), 웹 애플리케이션 서버(WAS, Web Application Server), 리버스 프록시(Reverse Proxy)라는 분류는 흐릿하게 쓰인다.

세 분류는 도구 이름이 아니라 풀어내는 문제로 갈린다. 정적 컨텐츠 전달, 동적 컨텐츠 생성, 트래픽 중개는 서로 다른 문제다. 어느 도구가 어느 책임을 맡는지에 따라 같은 이름이 다른 분류로 불리기도 한다.

Web Server

웹 서버는 HTTP 요청을 받아 응답을 돌려준다. 기본 역할은 디스크의 정적 파일 — HTML, CSS, JavaScript, 이미지 — 을 그대로 전달하는 것이다.

Apache HTTP Server, nginx, lighttpd가 대표적이다. OS 파일 시스템에서 파일을 읽어 HTTP 응답 본문에 실어 보낸다. HTTP 캐싱, gzip 압축, range 요청 처리 같은 프로토콜 레벨 최적화도 함께 한다.

요청 처리 모델은 도구마다 다르다. Apache의 prefork MPM은 요청당 프로세스를 띄우고, nginx는 event-driven 비동기 모델로 동작한다. 동시 연결 수가 높을수록 event-driven 모델이 메모리 효율적이지만, 정적 응답이 단순할 때는 두 모델의 차이가 크게 드러나지 않는다.

웹 서버 자체는 동적 컨텐츠를 만들지 않는다. PHP 페이지처럼 매 요청마다 결과가 달라지는 응답은 별도 처리 경로로 넘긴다.

Web Application Server

WAS는 동적 컨텐츠를 만든다. 매 요청마다 비즈니스 로직을 실행하고 데이터베이스에서 데이터를 가져와 응답을 조립한다. 정적 파일 전달과 달리 요청마다 결과가 달라질 수 있다.

Java 진영의 Tomcat, Jetty, WebLogic이 대표적인 WAS다. Python의 Gunicorn + WSGI 앱, Node.js의 Express도 같은 책임을 맡는다. 언어와 런타임은 달라도 “요청 → 비즈니스 로직 실행 → 응답” 흐름은 공통이다.

WAS도 HTTP 요청을 직접 받을 수 있다. Tomcat은 자체 HTTP connector를 가지고 있어 8080 포트에서 요청을 받는다. 운영 환경에서는 WAS 앞에 웹 서버나 reverse proxy를 두는 구성이 일반적이다. 정적 파일 응답은 더 빠르게 처리하는 쪽에 맡기고, WAS는 동적 처리에 집중한다.

세션 관리, 트랜잭션, 커넥션 풀 같은 비즈니스 로직 인프라도 WAS가 맡는다. 웹 서버에는 없는 책임이다.

Reverse Proxy

reverse proxy는 클라이언트와 백엔드 사이에서 요청을 중개한다. 클라이언트는 reverse proxy를 백엔드처럼 보고 요청을 보내고, reverse proxy는 받은 요청을 적절한 백엔드로 전달한 뒤 응답을 돌려준다.

중개 자체보다 중개 과정에서 붙는 기능이 핵심이다. 트래픽 분산, SSL/TLS 종료, 캐싱, 인증/인가, 요청 변환이 일반적이다. 백엔드 여러 대가 같은 reverse proxy 뒤에 있으면 클라이언트는 한 주소만 보고, reverse proxy가 어느 백엔드로 보낼지 결정한다.

nginx와 HAProxy가 대표적이다. nginx는 웹 서버 역할도 같이 하고, HAProxy는 reverse proxy와 로드 밸런서에 집중한 도구다.

reverse proxy는 동적 컨텐츠를 만들지도 않고, 정적 파일 응답을 주된 책임으로 두지도 않는다. 트래픽 흐름의 중간에 서서 흐름 자체를 제어한다.

nginx + Tomcat 조합

운영 환경에서는 세 책임이 한 도구에 묶이기도 하고 분리되기도 한다. nginx는 웹 서버와 reverse proxy 양쪽 역할을 하기 때문에 둘 중 하나만 별도로 두지 않아도 된다. WAS (Tomcat, Spring Boot 등) 앞에 nginx를 두는 구성이 가장 흔한 조합이다.

flowchart LR
    Client[클라이언트] --> Nginx[nginx
reverse proxy + 정적 컨텐츠] Nginx -->|정적 파일| Disk[(디스크)] Nginx -->|동적 요청| Tomcat[Tomcat
WAS] Tomcat --> DB[(데이터베이스)]

이 구성에서 nginx는 HTML, CSS, JavaScript, 이미지 응답과 트래픽 중개 (SSL 종료, 로드 밸런싱) 를 맡는다. Tomcat은 Java 서블릿과 비즈니스 로직 실행을 맡는다. 세 책임이 두 도구로 나뉜다.

분리 폭은 운영 규모에 따라 달라진다. 트래픽이 작으면 nginx 없이 Tomcat만으로도 동작한다. 트래픽이 크면 reverse proxy와 웹 서버를 다시 분리할 수도 있고, reverse proxy 앞에 또 다른 L4 로드 밸런서를 둘 수도 있다.

마무리

세 도구가 같은 자리에 보여도 풀어내는 문제는 다르다. 정적 컨텐츠 전달, 동적 컨텐츠 생성, 트래픽 중개 중 어느 책임을 어느 도구가 맡는지는 운영 환경에 따라 달라진다. 책임을 먼저 짚어보면 도구 선택에서 흐릿함이 줄어든다.

참고