실무에서 흔히 Nginx와 Spring 혹은 Node.js 서버를 함께 사용한다. 이 둘은 어떤 역할을 나눠서 담당하고 있을까?
핵심 정의
- 웹서버(Web Server): HTTP 요청을 받아 정적 콘텐츠를 빠르게 응답하는 서버다. Nginx, Apache가 대표적이다.
- WAS(Web Application Server): 동적 콘텐츠를 생성하고 비즈니스 로직을 처리하는 서버다. Spring Boot, Node.js, Tomcat이 대표적이다.
역할 분리의 이유
1. 서버 부하 방지
WAS는 DB 조회, 인증, 계산 등 복잡한 로직을 처리한다. 정적 파일(HTML, CSS, JS, 이미지)까지 WAS가 처리하면 부하가 커지고 동적 요청의 응답 속도가 느려진다. 웹서버가 정적 콘텐츠를 앞단에서 빠르게 처리하면 WAS는 비즈니스 로직에 집중할 수 있다.
2. 보안 강화
WAS는 데이터베이스와 직접 통신하며 중요한 비즈니스 로직을 처리한다. 외부에 직접 노출되면 공격 표면이 넓어진다. 웹서버를 앞단에 배치하면 다음과 같은 보안 이점이 있다.
- WAS의 실제 IP 주소를 숨길 수 있다
- SSL 인증서를 웹서버에서 관리하여 암복호화를 집중 처리한다
- 악성 요청을 웹서버에서 필터링하여 WAS까지 도달하지 못하게 한다
3. 장애 극복 (Failover)
대규모 서비스에서는 여러 WAS 인스턴스를 운영한다. 웹서버가 로드밸런서 역할을 하면서 특정 WAS에 장애가 발생해도 다른 WAS로 요청을 전달할 수 있다. 사용자는 장애를 느끼지 못하고 서비스를 이용할 수 있다.
4. 확장성
웹서버와 WAS가 분리되면 각각 독립적으로 확장할 수 있다. 트래픽 증가 시 WAS만 수평 확장(Scale-out)하거나, 정적 콘텐츠 요청이 많으면 CDN과 연동하여 웹서버 부하를 줄일 수 있다.
역할 비교
| 구분 | 웹서버 (Nginx) | WAS (Spring, Node.js) |
|---|---|---|
| 역할 | 요청/응답 처리, 정적 파일 제공 | 동적 요청 처리, 비즈니스 로직 수행 |
| 예시 | HTML, CSS, JS, 이미지 응답 | 로그인, 결제, DB 조회 |
| 특징 | 빠르고 가벼움, 이벤트 기반 | 자원 소모 큼, 멀티스레드 |
| 프로토콜 | HTTP/HTTPS, HTTP/2 | HTTP, RMI, RPC 등 |
| 확장 | 수평 확장 용이 | 수평/수직 확장 모두 필요 |
웹서버의 주요 기능
리버스 프록시
클라이언트 요청을 받아 적절한 백엔드 서버로 전달한다. 클라이언트는 WAS의 존재를 알 필요가 없다.
location /api {
proxy_pass http://backend:8080;
}로드밸런싱
여러 WAS 인스턴스로 요청을 분산한다. Round Robin, Least Connections 등 다양한 알고리즘을 지원한다.
upstream backend {
server was1:8080;
server was2:8080;
server was3:8080;
}SSL 종료 (SSL Termination)
SSL 암복호화를 웹서버에서 처리한다. WAS는 암호화 연산 부담 없이 비즈니스 로직에 집중할 수 있다. 인증서 관리도 웹서버 한 곳에서 처리하면 된다.
정적 파일 캐싱
자주 요청되는 정적 파일을 메모리에 캐싱하여 빠르게 응답한다. CDN과 연동하면 전 세계 사용자에게 빠른 응답을 제공할 수 있다.
구조 예시
사용자 → Nginx (웹서버) → Spring/Node.js (WAS) → DB, 외부 API
├─ 정적 파일 직접 응답
├─ SSL 종료
├─ 로드밸런싱
└─ 동적 요청만 WAS로 전달
실무 시나리오
시나리오: 이벤트 페이지 트래픽 폭증
문제: 이벤트 시작과 동시에 사용자가 몰리면서 WAS CPU 사용률 100% 도달
해결 방안:
- 정적 이벤트 페이지는 Nginx에서 직접 응답하도록 설정
- WAS를 수평 확장하고 Nginx에서 로드밸런싱
- CDN을 연동하여 이미지, CSS, JS 요청을 분산
결과: WAS는 당첨 로직, DB 조회 등 핵심 로직에만 집중할 수 있다.
주의사항
- 웹서버가 단일 장애 지점(SPOF)이 될 수 있다. 고가용성이 필요하면 웹서버도 이중화한다.
- SSL 종료 후 내부 네트워크 통신이 평문(HTTP)이면 보안에 취약하다. 필요시 내부 통신도 암호화(Re-encryption)를 고려한다.
- Keepalive 연결을 설정하지 않으면 매 요청마다 TCP 핸드셰이크가 발생하여 성능이 저하된다.
웹서버와 WAS를 분리하면 보안, 성능, 확장성, 장애 대응 모든 측면에서 이점을 얻을 수 있다.