notes
Cloud v 로드밸런싱
Cloud V 로드밸런싱 구성·백엔드 연결과 트래픽 분산 설정 메모.
1. 전체 구조 (권장)
[사용자] → DNS → Cloud V L7 LB (대표 IP)
↓
┌──────────┼──────────┐
[서버1:3000] [서버2:3000] [서버N:3000]
(동일 Docker 이미지)
- LB 앞단: 443(HTTPS) + 필요 시 80→443 리다이렉트
- LB 뒤단(백엔드): 각 VM의 앱 포트로 전달
2. 스크린샷 기준 — 수정 포인트
지금 화면은 LB 80 → 서버 80인데, 이 프로젝트는 앱이 3000에서 뜹니다.
docker-compose로 호스트 13004에 매핑했다면, LB 백엔드 포트는 13004로 맞추면 됩니다. LB → VM IP:13004.
3. Standard LB vs Dynamic LB
- 처음엔 Standard LB로 시작
- 동시 접속·피크가 1만에 가깝거나 CPU/연결 한계가 보이면 Dynamic 전환
4. 스케줄링 알고리즘
Cloud V 권장은 Source Hashing입니다.
- Source Hashing: 같은 IP → 같은 서버 (세션·캐시 안정)
- Round Robin: 균등 분산 (서버 성능이 비슷할 때)
- Least Connection: 연결 수 적은 서버 우선
이 프로젝트는 memSeq 쿠키·iron-session 등 쿠키 기반이라 Round Robin도 가능합니다.
다만 Next SSR·React Query 캐시·배포 직후 노드별 차이를 줄이려면 Source Hashing을 권장합니다.
5. 서버 노드 등록 체크리스트
- VM마다 같은 Docker 이미지 배포 (
APP_NAME=thankqcamping) - Cloud V LB에서 내부 IP(스마일서브/베어메탈 대역) 등록
- 노드 등록 후 「시작」 클릭 (안 하면 분산 안 됨)
- LB 방화벽: 443, 80 인바운드
- 백엔드 VM 방화벽: LB IP → 3000(또는 13004) 허용
6. HTTPS 설정
- 443 HTTPS 리스너 추가
- 인증서: Cloud V/도메인 SSL 또는 Let's Encrypt
- 백엔드는 HTTP 3000 유지 (SSL 종료는 LB에서)
next.config.ts의 serverActions.allowedOrigins에 실제 배포 도메인이 들어가 있는지 확인하세요.
7. 헬스체크 (추가 권장)
현재 /api/health 같은 경로가 없습니다. LB 모니터링용으로 가벼운 엔드포인트 추가를 권장합니다.
// apps/thankqcamping/app/api/health/route.ts
export function GET() {
return Response.json({ status: "ok" }, { status: 200 });
}
모니터링: /api/health, 기대 응답 200.
8. 배포·운영 팁
- 롤링 배포: LB에서 노드 1대 중지 → 배포 → 헬스체크 OK → 시작 → 다음 노드
- 동일 빌드: 모든 노드에 같은
DEPLOYMENT_VERSION(NextdeploymentId·정적 chunk 불일치 방지) - 백엔드 API는 Next rewrites로 프록시 → LB는 프론트(Next)만 분산하면 됨
- DNS A레코드를 LB 대표 IP로
9. 예시 최종 설정
로드밸런서 이름: thankqcamping-prod-lb
스케줄링: Source Hashing
사양: Standard LB
[서비스 Port 1]
Protocol: HTTPS
LB Port: 443
Server Port: 3000
Monitoring: /api/health, 15초, 5초
[서비스 Port 2] (선택)
Protocol: HTTP
LB Port: 80
Server Port: 3000
(80 → 443 리다이렉트는 LB 또는 앱에서 처리)
백엔드 노드:
- web-01 (10.x.x.1:3000) [시작]
- web-02 (10.x.x.2:3000) [시작]
서버가 몇 대인지, 도메인·SSL을 LB에서 할지 VM에서 할지 알려주시면 그에 맞춰 포트·방화벽·HTTPS 값을 더 구체적으로 적어드리겠습니다 🙏