1. 왜 Apache와 Spring Boot를 연결할까?
- Spring Boot는 기본적으로 내장 톰캣을 사용한다. (처음에 스프링 부트로 설정해놓고 톰캣에 띄우려고 해서 애를 먹었다...)
- 하지만 직접 8080 포트를 열어두고 운영하기엔 불편하거나 위험할 수 있어 아파치를 통해 들어오도록 하여 톰캣에 올린 웹 서비스의 서버 ip를 외부 사용자로부터 감춘다.
- 또한 로드밸런싱 기능으로 트래픽 분산을 하여 서버의 가용성을 유지할 수 있다.
- ➡️ 오늘 실습에서는 Apache를 앞단에 두고, Spring Boot를 프록시 연결해 보았다.

2. 실습 환경
- 사용한 운영체제: Ubuntu (홈서버)
- Apache 설치 방식: 소스 수동 빌드 (/usr/local/apache2)
- Spring Boot 앱 실행 방식: JAR 실행 (java -jar)
- 포트 설정: Apache 80 → Spring Boot 8080
3. 실습 흐름
1. Spring Boot 내장 톰캣 앱 실행 (8080)
2. Apache가 설치되어 있고 80포트에서 요청 수신
3. Apache 설정 파일에 ProxyPass로 프록시 설정
4. 브라우저에서 서버 IP로 접속 → Hello World 출력!
4. Spring Boot 실행
- JAR 실행
// Spring Boot 애플리케이션을 백그라운드에서 실행하면서, 로그를 파일로 저장하기 위한 표준적인 실행 방식
nohup java -jar craft-shop.jar --server.port=8080 > log.txt 2>&1 &
- 실행 확인
curl http://localhost:8080
5. Apache 프록시 설정 과정
1) Apache 설정 파일 열기
sudo nano /usr/local/apache2/conf/httpd.conf
2) proxy 모듈 활성화
아래 라인의 주석을 해제해준다. 이 두 줄은 Apache 설정에서 리버스 프록시 기능을 사용할 수 있도록 "모듈을 로딩"하는 부분이다.
LoadModule proxy_module modules/mod_proxy.so // Apache의 기본 프록시 엔진을 활성화
LoadModule proxy_http_module modules/mod_proxy_http.so // HTTP 프로토콜로 프록시를 할 수 있게 해주는 모듈
💡 LoadModule이란?
Apache는 기능들을 "모듈" 단위로 쪼개서 관리한다. LoadModule은 Apache가 실행되면서 특정 기능을 메모리에 로딩하게 하는 명령어. Apache의 설정 파일에서 이걸 선언하지 않으면, 해당 기능은 비활성화 상태라 사용 불가.
3) ServerName 지정
ServerName localhost
위치: httpd.conf 파일 맨 위쪽 또는 Listen 80 근처
이렇게 하면 내부에서만(로컬 호스트에서만) 접속이 가능하다. localhost는 127.0.0.1로 고정된 내부 ip라 모든 컴퓨터에서 자기 자신을 가리키는 주소기 때문이다.
--> 외부에서 접속이 가능하게 하려면 공인 IP 주소를 사용해야 한다.
나는 외부에서 접속이 가능하게끔 하고 싶어서 공인 아이피와 포트포워딩 설정을 해주었다. 이제 어디서는 내가 띄운 스프링부트 페이지에 접속할 수 있다 !!

4) VirtualHost 설정
<VirtualHost *:80>
ServerName localhost
ProxyPreserveHost On ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
ErrorLog logs/error.log
CustomLog logs/access.log combined
</VirtualHost>
여기서도 마찬가지로 외부접속이라면 serverName을 공인 아이피로 바꾸주면 된다.
6. Apache 재시작 & 확인
sudo /usr/local/apache2/bin/apachectl restart
sudo lsof -i :80
7. 접속 테스트
http://공인 IP
→ Hello World가 출력되면 성공!
8. 프록시 동작 원리 요약
- 브라우저는 Apache에게 요청
- Apache는 요청을 Spring Boot에게 프록시
- Spring Boot는 응답을 보내고, Apache는 그대로 전달
- Apache는 단순히 중계자 역할 (리버스 프록시)
9. 마무리
- 단순히 JAR 실행만 했던 Spring Boot를 Apache와 붙여보니 운영하는 느낌이 났다
- 생각보다 프록시 연결은 간단하지만, 구조를 이해하면 더 강력하게 쓸 수 있다.. 공부 필요..
- 다음엔 HTTPS 적용도 해보고 싶다!
서버 공부는 오래전부터 하고 싶었다. 하지만 어디서 부터 시작해야할지ㅠㅠ 서버 올리는건 aws밖에 없는 줄 알았다..
최근에 같이 입사한 언니가 서버 교육을 받기 시작하면서 나도 퇴근 후에라도 조금씩 따라하고있다.
다음은 apache와 nginx의 차이점에 대해 공부해보고 nginx로 프록시 설정을 해볼 예정이다.
'CS 지식 > DevOps' 카테고리의 다른 글
| [DevOps] Jenkins로 중단 배포 (5) | 2025.08.03 |
|---|---|
| [DevOps] Nginx 도커로 띄우기, 왜 Docker인가? (3) | 2025.07.20 |
| [DevOps] Apache와 Nginx 차이 (2) | 2025.07.04 |
| [DevOps] CI / CD 무중단 배포 (0) | 2024.06.22 |