FastAPI, NextJS 배포 환경 구축

이선엽·2026년 2월 26일
post-thumbnail

FastAPI

FastAPI를 사용한 이유는 이름대로 빠르게 만들고 싶었습니다.
지금까지는 SpringBoot를 사용하여 개발했었는데, 해당 프레임워크를 벗어나 다른걸 해보고 싶기도 했고, Python을 좀 더 써보고 싶었습니다.

상당히 간단하니 추천드립니다.

환경은 Rocky Linux 입니다.

FastAPI 환경

코드는 git에 있는것을 내려 받아 사용하니, python으로 실행할 수 있는 환경만 갖추어 주면 됩니다.

python: 3.12.11

# 폴더 생성
/home/backend

#  저장소 받기 및 이동
git clone https://github.com/본인-저장소/back.git
cd back

# 가상환경 생성
python3 -m venv venv

# venv 활성화
source venv/bin/activate

# 패키지 설치 - 제가 사용하는 패키지들입니다.
pip install 'fastapi[all]' sqlalchemy python-dotenv psycopg2-binary requests pytz confluent-kafka tzdata redis python-slugify pillow minio nanoid setuptools

restart Script 작성

쉽게 끄거나, 켜기 위해서 shell script를 하나 작성 했습니다.
실행할 때 저는 worker를 9개 사용합니다.

명령어: ./restart.sh start(stop, restart)

restart.sh

#!/bin/bash

. venv/bin/activate

DEFAULT_PORT=9000
ACTION=$1
PORT=${2:-$DEFAULT_PORT}
PID_FILE=uvicorn.pid

start_server() {
  if [ -f $PID_FILE ]; then
    echo "이미 실행 중입니다 (PID: $(cat $PID_FILE))"
    exit 1
  fi

  echo "FastAPI 서버 실행 (포트 $PORT)"
  nohup uvicorn main:app \
    --workers 9 \
    --host=0.0.0.0 \
    --port=$PORT \
    --no-access-log \
    > log.out 2>&1 &

  echo $! > $PID_FILE
}

stop_server() {
  if [ ! -f $PID_FILE ]; then
    echo "실행 중인 서버가 없습니다"
    return
  fi

  PID=$(cat $PID_FILE)
  echo "FastAPI 서버 종료 (PID: $PID)"

  kill -TERM $PID

  # graceful wait
  for i in {1..10}; do
    if ps -p $PID > /dev/null; then
      sleep 1
    else
      break
    fi
  done

  # still alive → force kill
  if ps -p $PID > /dev/null; then
    echo "강제 종료(SIGKILL)"
    kill -9 $PID
  fi

  rm -f $PID_FILE
}

case "$ACTION" in
  start) start_server ;;
  stop) stop_server ;;
  restart) stop_server && sleep 1 && start_server ;;
  *) echo "사용법: $0 {start|stop|restart} [포트번호]" ;;
esac

deactivate

NextJS

초기에는 React를 사용해서 개발했었습니다.
학생때 개발 시작을 React로 시작해서 애착이 가는 라이브러리입니다.

그런데, B2B 개발만 해보고 대국민 커뮤니티는 처음 해봐서 SEO, sitemap, analytics 등을 뒤늦게 깨닫고 NextJS 프레임워크로 전환을 했습니다.

자세하게 보는게 아닌 간단하게 보는거지만 lightspeed에서 체감이 컸습니다.

저는 ISR 방식을 사용해서 주기적으로 데이터를 갱신합니다.
SSG 기반으로 주기적으로 데이터를 재생성 하는데 이게 정말 맛있습니다.

사용자 입장에서 로딩 없이 바로 화면에 떠서 좋습니다.

NextJS 환경

코드는 git에 있는것을 내려 받아 사용하니, nodeJS로 실행할 수 있는 환경만 갖추어 주면 됩니다.

NodeJS: 24.11.1

# 폴더 생성 - a로 한 이유는 개발용 페이지를 b로 하나 더 뒀었습니다..
/home/frontend_a

#  저장소 받기 및 이동
git clone https://github.com/본인-저장소/front.git
cd front

# node 24 script 추가
curl -fsSL https://rpm.nodesource.com/setup_24.x | sudo bash -

# node 24 설치
sudo dnf install -y nodejs

# 버전 확인
node -v
npm -v

# npm install
npm install

restart Script 작성

FastAPI와 동일하게 shell script를 하나 작성 했습니다.

#!/bin/bash

# 설정
APP_DIR="/home/frontend_a/eft-library-front"
NODE="/usr/bin/npm"
KILL="/bin/kill"
NETSTAT="/usr/bin/netstat"
GREP="/usr/bin/grep"
AWK="/usr/bin/awk"
CUT="/usr/bin/cut"
SLEEP="/bin/sleep"
NOHUP="/usr/bin/nohup"
DEFAULT_PORT=3000

# 인자 처리
ACTION=$1
PORT=${2:-$DEFAULT_PORT}

# 포트 사용 중인 프로세스 종료 함수
stop_server() {
  pid=$($NETSTAT -tnlp 2>/dev/null | $GREP ":$PORT\b" | $AWK '{print $7}' | $CUT -d'/' -f1)
  if [ -n "$pid" ]; then
    echo "포트 $PORT를 사용 중인 프로세스(PID: $pid)를 종료합니다."
    $KILL -9 "$pid"
  else
    echo "포트 $PORT를 사용 중인 프로세스가 없습니다."
  fi
  $SLEEP 1
}

# 애플리케이션 빌드 및 시작 함수
start_server() {
  echo "앱 디렉토리로 이동: $APP_DIR"
  cd "$APP_DIR" || { echo "디렉토리 이동 실패"; exit 1; }

  echo ".next 디렉토리 제거 중..."
  rm -rf .next/

  echo "Next.js 빌드 시작..."
  $NODE run build --prefix "$APP_DIR"

  echo "Next.js 서버를 포트 $PORT에서 시작합니다."
  $NOHUP bash -c "PORT=$PORT $NODE run start --prefix $APP_DIR" > "$APP_DIR/log.out" 2>&1 &
}

# 실행 분기
case "$ACTION" in
  start)
    start_server
    ;;
  stop)
    stop_server
    ;;
  restart)
    stop_server
    start_server
    ;;
  *)
    echo "사용법: $0 {start|stop|restart} [포트번호]"
    exit 1
    ;;
esac
profile
만드는게 좋아

0개의 댓글