[DevOps] Apache와 Spring Boot 연결
1. 왜 Apache와 Spring Boot를 연결할까?Spring Boot는 기본적으로 내장 톰캣을 사용한다. (처음에 스프링 부트로 설정해놓고 톰캣에 띄우려고 해서 애를 먹었다...)하지만 직접 8080 포트를 열어두고 운영
ghan2.tistory.com
지난 실습으로 아파치와 스프링 부트를 연결해서 서버에 접속해보았다.
현재 웹 서버로는 nginx가 많이 쓰이는 추세인데 아파치부터 실습을 해보는 걸 추천하셔서 공부하게됐다.
웹 서버 하면 apache와 nginx를 많이 들어왔는데 둘의 차이점은 무엇이고 왜 nginx가 많이 쓰이고 있을까?
# 기본 개념
- Apache: 1995년부터 이어온 전통적인 웹 서버
- Nginx: 2004년 러시아 개발자가 만든 고성능 서버
배경을 이해하는 데 있어 아래 영상이 도움이 많이 됐다 !
https://youtu.be/6FAwAXXj5N0?feature=shared
Apache HTTP Server — “웹의 원조”
- 출시년도: 1995년
- 개발자: 여러 명의 자유 소프트웨어 개발자 커뮤니티
- 기반: NCSA HTTPd (미국 국립 슈퍼컴퓨터 응용 센터에서 만든 서버)
- 당시 웹이 막 시작되는 시기, 브라우저(모자이크, 넷스케이프 등)가 막 보급되며 HTTP 서버 수요 급증
- 무료로 쓸 수 있고 확장 가능한 오픈소스 웹 서버 필요
- 수많은 모듈(mod_rewrite, mod_ssl, mod_php 등)을 통해 거의 모든 웹 기능을 구현 가능하게 함
Nginx — “성능 한계를 부순 고성능 서버”
- 출시년도: 2004년
- 개발자: Igor Sysoev (러시아 개발자)
- Apache는 다수 접속 처리에 한계가 있었음. 러시아 최대 포털 사이트(Rambler)의 트래픽을 처리하기 위해 고성능 웹 서버 필요
- Apache는 요청 수만큼 프로세스/스레드를 만들어야 해서 수천~만 명 접속에 취약
- Nginx는 이벤트 기반 비동기 I/O 처리로 수만 개 연결도 CPU 거의 안 쓰고 처리 가능
- 또한 리버스 프록시, 로드밸런서, 정적 자원 처리 기능이 탁월
# 아키텍처 비교
🔹 Apache 구조 (Process/Thread per Request)
Apache는 기본적으로 클라이언트의 요청이 들어올 때마다 새로운 프로세스나 스레드를 생성해서 처리하는 구조를 가지고 있다.
처음에는 Apache의 마스터 프로세스(Master Process)가 실행되고, 요청이 들어오면 이 마스터가 작업자를 새로 만들어서 그 요청을 전담하게 한다. 이 작업자는 프로세스일 수도 있고, 스레드일 수도 있는데, 이건 Apache가 사용하는 MPM(Multi-Processing Module) 방식에 따라 달라진다.
- prefork 방식: 요청마다 별도 프로세스를 생성해서 처리함. 스레드를 쓰지 않기 때문에 안정성은 높지만, 속도는 느리고 자원 소비가 크다. ( 자식 프로세스를 먼저 시작해 놓고, 클라이언트 요청에 대해서 각각의 자식 프로세스가 통신을 담당)

- worker 방식: 하나의 프로세스 안에서 여러 스레드를 만들어서 처리함. 메모리 사용은 줄지만, 스레드 관리 이슈 있을 수 있음.
- event 방식: 비동기 방식처럼 동작하도록 시도한 구조. 내부적으로는 여전히 스레드를 기반으로 한 구조라 완전한 비동기 서버는 아님
요청이 많아질수록 Apache는 그 수만큼 스레드나 프로세스를 만들어야 한다. 그 결과, 시스템 리소스를 많이 소모하고, context switching도 커져서 대량의 동시 접속이 발생하면 성능이 급격히 떨어질 수 있다.
그럼에도 불구하고 여전히 많이 쓰이는 이유는 뭘까? Apache는 수많은 모듈과 .htaccess 기능을 통해 유연한 설정이 가능하고, PHP와의 높은 호환성 덕분에 레거시 시스템이나 워드프레스 환경에 최적화되어 있다. 설정이 비교적 쉬워 진입장벽이 낮고, 안저어성과 커뮤니티 지원도 뛰어나 여전히 많은 웹 서버에서 사용되고 있다. 비록 성능 면에서는 Nginx에 밀리지만, 기능적 편의성과 호환성 측면에서는 강력한 선택지다.
🔹 Nginx 구조 (Event Loop, 비동기 논블로킹)
nginx는 apache와는 완전히 다른 방식으로 클라이언트 요청을 처리한다. 기본적으로 하나의 워커 프로세스가 여러 요청을 동시에 처리할 수 있는 구조를 가지고 있다. 이 때 사용하는 방식이 이벤트 루프(Event Loop) 기반의 비동기/논블로킹 방식이다.
클라이언트가 요청을 보내면, 마스터 프로세스가 요청을 받아서 하나 이상의 워커 프로세스에 그 요청을 전달한다.
apache 처럼 요청마다 새로운 스레드나 프로세스를 만드는 것이 아닌, 하나의 워커 프로세스가 수많은 요청을 이벤트 큐(event queue)에 등록한 후, 이벤트 루프를 통해 준비된 작업만 비동기적으로 처리한다.

# 결론
- Apache는 전통적인 웹 서버 구조에 충실하고, 확장성과 유연성이 높은 반면,
동시 요청 처리에 약하다는 태생적 한계를 가짐. - Nginx는 아예 이벤트 루프 기반 구조로 태어난 고성능 서버로,
정적 자원 처리와 리버스 프록시 역할에 매우 강력함.
요청 처리 방식 자체가 다르기 때문에,
트래픽이 많아지는 요즘 같은 환경에서는 Nginx처럼 비동기 처리에 강한 서버가 더욱 적합하다는 생각이 들었다.
Apache로 진행했던 실습에 이어, Nginx로도 직접 요청을 서빙해보는 실습을 해보고 싶다.
'CS 지식 > DevOps' 카테고리의 다른 글
| [DevOps] Jenkins로 중단 배포 (5) | 2025.08.03 |
|---|---|
| [DevOps] Nginx 도커로 띄우기, 왜 Docker인가? (3) | 2025.07.20 |
| [DevOps] Apache와 Spring Boot 연결 (0) | 2025.07.01 |
| [DevOps] CI / CD 무중단 배포 (0) | 2024.06.22 |