서론
현대 웹 애플리케이션 아키텍처에서 웹 서버(Web Server) 와 웹 애플리케이션 서버(WAS, Web Application Server) 의 역할을 명확히 이해하는 것은 고성능·고가용성 시스템을 설계·운영하는 데 필수적입니다. 두 서버는 종종 함께 사용되지만, 그 내부 기능과 책임 범위에는 분명한 차이가 있습니다. 본 글에서는 웹 서버와 WAS의 정의·구조·주요 기능·실제 구성 예시를 살펴보고, 어떤 상황에서 각각을 선택·조합해야 하는지에 대해 안내합니다.
웹 서버(Web Server)
정의
- 웹 서버는 HTTP(S) 프로토콜을 통해 들어오는 요청을 처리하고, 주로 정적 콘텐츠(HTML, CSS, JavaScript, 이미지 등)를 클라이언트에 전달하는 서버 소프트웨어입니다.
- 전통적으로 정적 파일 서비스, 로드 밸런싱, SSL 종료(SSL termination) 등이 주요 기능입니다.
주요 기능
- 정적 컨텐츠 서비스
- 파일 시스템 상의 리소스를 직접 읽어 HTTP 응답 본문으로 반환
- 캐시 설정(Expires, Cache-Control) 및 압축(Gzip) 지원
- SSL/TLS
- 클라이언트와의 암호화 통신(HTTPS)을 처리
- 인증서 관리 및 갱신(AutoSSL, Let’s Encrypt 연동 등)
- 로드 밸런싱 & 리버스 프록시
- 다수의 백엔드 서버(WAS 등)로 트래픽 분산
- 요청 URL·헤더 기반 라우팅
- 정책 기반 접근 제어
- IP 화이트/블랙리스트
- 요청 크기·시간 제한
대표 소프트웨어 및 아키텍처
- Apache HTTP Server
- 모듈 기반 구조(apache2 모듈)
- Multi-Processing Module(MPM) 선택 가능
- Nginx
- 이벤트 기반 비동기 모델(Worker 프로세스 + Event Loop)
- 낮은 메모리·CPU 사용으로 고성능
- Microsoft IIS
- Windows 통합 관리
- .NET 애플리케이션과 호환성
Nginx 이벤트 모델 예시
Nginx
worker_processes auto;
events {
worker_connections 1024;
}
http {
sendfile on;
gzip on;
server {
listen 80;
server_name example.com;
root /var/www/html;
}
}
Nginx웹 애플리케이션 서버(WAS)
정의
- WAS는 서버측에서 실행되는 동적 애플리케이션 로직(서블릿, JSP, EJB, Spring Bean 등)을 처리하고, 비즈니스 로직·데이터베이스 연동·트랜잭션 관리 기능을 제공하는 서버 환경입니다.
- HTTP 요청을 받아 내부 로직을 수행한 뒤, 결과를 웹 서버 혹은 클라이언트로 반환합니다.
주요 기능
- 서블릿/컨테이너 기능
- Java EE 기준의 Servlet, JSP 스펙 준수
- 서블릿 라이프사이클 관리(init(), service(), destroy())
- 비즈니스 로직 실행
- EJB(Enterprise JavaBeans), CDI, Spring Framework 등 컴포넌트 실행
- 데이터베이스 커넥션 풀
- javax.sql.DataSource 인터페이스 기반 커넥션 풀 제공
- 트랜잭션 관리
- JTA(Java Transaction API) 연동
- 선언적 트랜잭션(@Transactional)
- 세션 관리
- HTTP 세션 클러스터링 및 세션 복제
- 보안 관리
- 인증·인가(폼 인증, BASIC, OAuth2)
- 역할 기반 접근 제어(RBAC)
대표 소프트웨어 및 아키텍처
- Apache Tomcat
- 경량 서블릿 컨테이너
- Spring Boot 기본 내장 서버로도 사용
- Jetty
- 임베디드 모드에 최적화
- 컴팩트한 구조
- WildFly (구 JBoss AS), Oracle WebLogic, IBM WebSphere
- 풀 스택 Java EE 서버
- 클러스터링·관리 콘솔·운영 툴 제공
Tomcat 서버.xml 예시 (Connector 설정)
XML
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="200"
minSpareThreads="25"
enableLookups="false" />
XML웹 서버 vs WAS 비교
구분 | 웹 서버 | WAS |
---|---|---|
처리 대상 | 정적 콘텐츠 | 동적 콘텐츠(비즈니스 로직) |
프로토콜 핸들링 | HTTP(S) | HTTP(S) + 서블릿/JSP 스펙 |
주요 기능 | 파일 서비스, SSL, 로드밸런싱 | 서블릿 컨테이너, 트랜잭션, 세션, 보안 |
성능 특성 | 낮은 리소스, 높은 동시 처리 | 로직 실행 비용, JVM·스레드 풀 관리 필요 |
확장성 | 가볍게 수평 확장 쉬움 | 클러스터링·세션 복제로 수평 확장 가능 |
구성 예시 | Nginx → 정적 리소스 직접 전달 | Nginx → WAS 프록시 → 동적 처리 수행 |
실제 인프라 구성 예시: Nginx + Tomcat 연동
- Nginx: 외부 요청 수신, SSL 종료, 정적 파일 서비스, 프록시 전달
- Tomcat: 동적 요청(예: /app/*) 처리, 비즈니스 로직 실행
Nginx
server {
listen 80;
server_name www.example.com;
# 정적 리소스 처리
location ~* \.(jpg|png|css|js|html)$ {
root /var/www/html;
expires 7d;
}
# 동적 요청 프록시
location /app/ {
proxy_pass http://127.0.0.1:8080/app/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
}
}
NginxTomcat 쪽에는 server.xml 의 Connector 설정만으로 포트 8080을 열어두고, 애플리케이션을 배포하면 됩니다.
선택 가이드
- 정적 콘텐츠가 대부분일 때
- Nginx, Apache와 같은 웹 서버 단독 운영
- CDN (Content Delivery Network) 활용 권장
- 복잡한 비즈니스 로직·데이터베이스 연동이 필요할 때
- WAS 기반 애플리케이션 서버 도입
- Spring, Jakarta EE 스펙 활용
- 대규모 트래픽 환경
- 웹 서버와 WAS를 분리하여 역할 분담
- 웹 서버 앞단에서 캐싱·SSL·로드밸런싱 처리
- WAS 클러스터링으로 세션·트랜잭션 안정성 확보
- 운영·유지보수 고려
- 경량화된 구조를 원하면 Tomcat + Jetty
- 엔터프라이즈 기능(관리 콘솔·클러스터링 등)이 필요하면 WildFly·WebLogic
결론
웹 서버는 정적 컨텐츠에 특화된 가볍고 빠른 처리 엔진이며, WAS는 동적 비즈니스 로직 실행·트랜잭션 관리 등 애플리케이션 실행 환경을 제공합니다. 대부분의 실무 환경에서는 두 서버를 적절히 조합(예: Nginx + Tomcat)하여, 정적 자원 서비스와 동적 로직 처리를 효율적으로 분리·최적화함으로써 높은 성능과 안정성을 달성합니다. 본 블로그의 구성 예시와 선택 가이드를 참고하여, 여러분의 시스템 요구사항에 맞는 최적의 서버 구성을 설계하시길 바랍니다.