| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
- java테스트
- 인텔리제이
- 테스트자동화
- Visual Studio Code
- 스프링부트
- 자바스크립트
- junit5
- SpringBoot
- string
- vscode
- junit
- Eclipse
- CSS
- 자바
- 자바문법
- html
- Array
- 단위테스트
- ArrayList
- 정규식
- Java
- 배열
- IntelliJ
- list
- 문자열
- math
- input
- HashMap
- javascript
- js
- Today
- Total
어제 오늘 내일
[Spring Boot] "배포할 때마다 서버가 죽어요?" 무중단 배포의 기초: Nginx 리버스 프록시 설정하기 본문
[Spring Boot] "배포할 때마다 서버가 죽어요?" 무중단 배포의 기초: Nginx 리버스 프록시 설정하기
hi.anna 2026. 3. 18. 10:13
지난 시간, GitHub Actions로 자동 배포까지 성공했습니다. 하지만 치명적인 단점이 하나 있었죠.
"배포하는 동안에는 서비스가 멈춘다(Downtime)."
이걸 해결하려면 서버를 두 대 띄우고 교대로 배포해야 하는데, 그러려면 사용자의 요청을 이리저리 토스해 줄 문지기가 필요합니다. 오늘 소개할 Nginx가 바로 그 주인공입니다.
1. 리버스 프록시(Reverse Proxy)가 뭔가요?
이름이 어렵지만 원리는 간단합니다.
클라이언트(사용자)가 스프링 부트 서버(8080 포트)에 직접 붙는 게 아니라, Nginx(80 포트)에게 먼저 요청을 보내고, Nginx가 뒤에 있는 스프링 부트에게 대신 전달하는 구조입니다.
왜 이렇게 쓰나요?
- 무중단 배포: A 서버가 배포 중이면 B 서버로 요청을 보내면 됩니다.
- 보안: 실제 서버(Spring Boot)의 IP나 포트를 숨길 수 있습니다.
- 성능: 정적 파일(HTML, CSS, 이미지)은 Nginx가 직접 처리해서 훨씬 빠릅니다.
- HTTPS 설정: SSL 인증서 적용을 Nginx에서 한 방에 해결할 수 있습니다.
2. EC2에 Nginx 설치하기
AWS EC2(Ubuntu)에 접속해서 명령어를 입력합니다.
# 1. 설치
sudo apt update
sudo apt install nginx
# 2. 실행 확인
sudo service nginx start
sudo service nginx status
이제 브라우저 주소창에 http://내-서버-IP (포트 번호 없이!)를 입력해 보세요.
"Welcome to nginx!" 라는 하얀 화면이 뜨면 성공입니다.
3. "80번 포트로 오면 8080번으로 넘겨줘!" (설정 변경)
이제 Nginx에게 "너한테 오는 요청을 내 스프링 부트(8080)로 토스해!" 라고 알려줘야 합니다.
설정 파일 열기
sudo vim /etc/nginx/sites-available/default
내용 수정하기 ( 부분)
기존 내용을 지우거나 주석 처리하고, 아래처럼 proxy_pass를 추가합니다.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
location / {
# ★ 여기가 핵심! localhost:8080으로 요청을 넘깁니다.
proxy_pass http://localhost:8080;
# (선택) 헤더 설정: 실제 사용자의 IP를 스프링에게 알려주기 위함
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
저장 후 재시작
# 설정 파일 문법 검사 (오타 확인)
sudo nginx -t
# Nginx 재시작 (설정 반영)
sudo service nginx restart
4. 결과 확인
이제 다시 브라우저에서 http://내-서버-IP (80번 포트)로 접속해 보세요.
아까는 Nginx 환영 페이지가 떴지만, 지금은 여러분이 만든 스프링 부트 애플리케이션 화면이 뜰 겁니다!
- 사용자 -> (80 포트) -> Nginx -> (8080 포트) -> Spring Boot
연결이 성공적으로 이루어졌습니다.
5. 무중단 배포를 위한 큰 그림 (Blue/Green)
이제 Nginx가 요청을 중계할 수 있게 되었습니다. 무중단 배포는 이 원리를 이용합니다.
- 스프링 부트 서버를 2개 띄웁니다. (8081번, 8082번)
- 평소에는 Nginx가 8081번만 바라봅니다. (
proxy_pass http://localhost:8081) - 배포할 때는 8082번을 몰래 켜서 배포합니다.
- 배포가 끝나면 Nginx 설정을 바꿔서 순식간에 8082번을 바라보게 합니다. (
reload) - 사용자는 서버가 바뀐지도 모르고 계속 서비스를 이용합니다.
이것이 바로 블루/그린(Blue/Green) 배포 전략입니다.
마치며
오늘의 결론입니다.
- Nginx는 사용자 요청을 받아서 뒷단의 서버로 넘겨주는 리버스 프록시 역할을 한다.
proxy_pass설정 하나면 80 포트(기본)로 들어온 요청을 8080 포트(스프링)로 연결할 수 있다.- 이 구조가 있어야 무중단 배포가 가능하다.
이제 무중단 배포를 위한 도화지는 다 그려졌습니다.
다음 포스팅에서는 진짜 무중단 배포 스크립트(Shell Script)를 작성해서, "배포 중에도 멈추지 않는 서버"를 완성해 보겠습니다. (이 시리즈의 하이라이트입니다!)
