로드밸런서 health-check fail, NestJS health-check, 502해결
이번주는 미루고 미루던 사이드 프로젝트 프론트,백 코드를 모두 배포하기로..!
1. 백엔드 서버 기존에 ec2에 배포해서 http 퍼블릭IPv4 주소로 연결해서 localhost에서 작업
2. 프론트엔드 배포, ec2를 새로 만들어서 배포, 80포트를 3000번포트로 연결해주기 위해 nginx로 포트포워딩
3. https설정을 위해 certbot을 시도했으나 이유를 알수없는 unauthorized에러 발생
4. 로드밸런서를 사용해서 ssl을 적용하는 방법이 있다는 것을 알게되어 로드밸런서 사용으로 변경
5. 도메인연결,포트포워딩,로드밸런서ssl적용까지 해서 배포 / 당연히 cors에러 발생
6. 센트리 배포하면서 https 와 http가 서로 통신할 수 없다는 것을 알고 있었으며 이 경우는 현재 내 백엔드 코드가 cors설정에 localhost를 열어주고 있었기 때문,
7. 정확한 프론트엔드 서버 url이 나왔으니 cors설정을 바꿔주고 백엔드 코드도 똑같이 https설정해서 배포하자.
8. 가비아에서 500원주고 도메인 구입, route53에 연결, acm에서 인증서 발급 후 로드밸런서에 연결
9. 로드밸런서 헬스체크 fail, 그리고api접근 시발생!


프론트엔드 배포하면서는 경험하지 못한 상황이다. 대상그룹을 자세히 살펴보자
상태검사 경로는 '/'로 되어있고 포트는 80이다.
지금 내 서버에 80번 포트로 접속해서 '/'에 접근하면 200을 받을 수 있나? 내 api서버는 '/'에 대한 응답이 없고
심지어 아직 8000번으로 접속해야 되는 상황이다.
검색해 보니 말로만 듣던 헬스체크가 바로 이 상태검사라는 것을 알았다.
80번 포트에 '/'로 신호를 보냈을 때 200번대 응답을 받지 못해서 헬스체크실패가 뜨고 있는 것이라고 판단했다.
프론트엔드 배포할 때는 왜 이런 상황을 못 봤을까?
1. 프론트엔드 서버에는 '/'에 대한 응답이 있다.
2. nginx설정을 하면서 포트포워딩을 먼저 설정해 놔서 80번 포트로 연결이 됐다.
그래서 일단 백엔드 서버도 헬스체크를 성공시켜 놓고 상황을 보기로!
NestJS공식문서에 헬스체크에 대한 코드가 아주 잘 작성되어 있다. 내 코드는 공식문서와 동일하다.
// health.module.ts
import { Module } from '@nestjs/common';
import { TerminusModule } from '@nestjs/terminus';
import { HealthController } from './health.controller';
import { HttpModule } from '@nestjs/axios';
@Module({
imports: [TerminusModule, HttpModule],
controllers: [HealthController],
})
export class HealthModule {}
// health.controller.ts
import { Controller, Get } from '@nestjs/common';
import {
HealthCheckService,
HttpHealthIndicator,
HealthCheck,
} from '@nestjs/terminus';
@Controller('health')
export class HealthController {
constructor(
private health: HealthCheckService,
private http: HttpHealthIndicator,
) {}
@Get()
@HealthCheck()
check() {
return this.health.check([
() => this.http.pingCheck('nestjs-docs', 'https://docs.nestjs.com'),
]);
}
}
헬스체크 코드를 작성하고 포스트맨으로 '/health' get요청 보내서 확인해 보니 200번 응답이 온다.

이제 로드밸런서 대상그룹 상태검사 경로를 '/health'로 바꿔주자. 아 그리고 아직 80번 포트로 접속이 안되니까 8000 포트로 설정


일단 헬스체크가 성공했고 <내 도메인>:8000/health로 응답도 확인했다.
이제 80번 포트를 8000으로 연결해 주자
백엔드코드가 배포된 ec2인스턴스에 접속해서 nginx를 설치한다.
sudo apt-get install nginx -y
이제 리버스프록시 설정을 하기 위해 아래 파일을 열어준다.
sudo vim /etc/nginx/sites-available/default
아래 설정으로 입력한다.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name <도메인 주소>;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
설정이 유효한지 확인 후 nginx 실행
sudo nginx -t
sudo systemctl reload nginx
그러면 <내 도메인>/health로 응답이 온다.
이제 대상그룹 포트를 다시 80으로 바꿔주면 프론트엔드와 cors에러 없이 통신한다.
배포가 끝났고, 다음에는 배포 자동화를 하고 싶은데.. 젠킨스가 쉽다는데 젠킨스로 해볼까?
참고자료
EC2로 배포한 Next.js 프로젝트 https 적용하기
우리는 지금까지 인스턴스 설정을 모두 마쳤다. 이제는 Github Actions를 세팅하기 위해 우리 프로젝트에 명령어 파일을 생성해야 한다. deploy.yml 생성 다음과 같이 최상위 디렉토리에 .github > workflows
velog.io
https://puterism.com/deploy-next-js-with-ec2/
AWS EC2로 Next.js 배포하기 - Puterism
AWS EC2를 통해 Next.js 프로젝트를 배포하는 방법이다. EC2 인스턴스 생성하기 먼저 EC2 인스턴스를 생성해야 한다. EC2 페이지에 접속해서 인스턴스 시작 버튼을 클릭한다. https://ap-northeast-2.console…
puterism.com