콘텐츠로 이동

Next.js 런타임 운영 기준 (Production)

Next.js는 React 기반 프론트엔드 프레임워크이지만, 운영 환경에서는 SSR 렌더링과 라우팅을 담당하는
프론트엔드 서버 런타임(Node.js 프로세스) 으로 실행됨.

운영 서버(Production Server) 에서 Next.js 프론트엔드 서버 런타임을 실행할 때
런타임 옵션, 환경 변수, 프로세스 동작 방식에 대한 운영 기준을 정의함.

코드 작성법이나 UI 구현 방식이 아닌,
Next.js 프론트엔드 서버 런타임(Node.js 프로세스)을 어떤 상태로 실행해야 안정적인가에 집중함.

본 문서의 표준 실행 모드는
next build + next start (Production SSR Mode) 임.


1. Next.js 프론트엔드 서버 런타임의 책임 범위

운영 환경에서 Next.js 프론트엔드 서버 런타임의 책임은 명확함.

  • HTTP 요청 처리 (Nginx 이후)
  • SSR 기반 프론트엔드 렌더링
  • 프론트엔드 라우팅 처리
  • API Route 실행 (사용하는 경우)
  • 상태 없는(stateless) 프로세스 유지

Next.js 프론트엔드 서버 런타임이 직접 책임지지 않는 영역:

  • TLS / HTTPS
  • 인증 / 접근 제어
  • Rate / Connection Limit
  • 외부 네트워크 제어
  • 정적 파일의 최종 전달 정책

위 영역은 모두 Nginx의 책임


2. 런타임 옵션을 명시적으로 관리해야 하는 이유

Next.js 프론트엔드 서버 런타임은 Node.js 프로세스로 동작함.
기본 옵션만으로도 실행은 가능하나,
운영 환경에서는 명시적 설정이 없을 경우 장애가 늦게 발견되거나 원인 추적이 어려워짐.

대표적인 문제:

  • SSR 렌더링 중 메모리 누수 → OOM Kill
  • 예외 미처리로 인한 프론트엔드 서버 프로세스 종료
  • 환경별 렌더링 동작 차이
  • 로그만으로는 SSR 장애 재현 불가

따라서 운영 환경에서는:

Next.js 프론트엔드 서버 런타임 실행 옵션과 환경 변수를 “암묵적”으로 두지 않음


3. 필수 런타임 환경 변수

3.1 NODE_ENV

운영 환경에서는 반드시 production 으로 고정함.

NODE_ENV=production

이유

  • Next.js 내부 최적화 로직 활성화
  • 디버그 및 개발용 로깅 비활성화
  • 불필요한 개발 코드 경로 제거

잘못된 사례

  • NODE_ENV 미설정
  • development 상태로 운영

3.2 PORT 환경 변수

Next.js 프론트엔드 서버 런타임은 포트를 코드에 하드코딩하지 않음.

PORT=3000

운영 기준

  • Next.js 런타임은 내부 포트만 사용
  • 외부 포트는 Nginx에서만 관리
  • 방화벽에서 Next.js 포트는 열지 않음

3.3 NEXT_TELEMETRY_DISABLED

운영 서버에서는 Next.js 텔레메트리 전송을 비활성화하는 것을 권장함.

NEXT_TELEMETRY_DISABLED=1
  • 외부 네트워크 통신 최소화
  • 불필요한 런타임 오버헤드 제거
  • 보안 및 운영 예측성 향상

PM2 적용 예시 (운영 권장)

// ecosystem.config.cjs
module.exports = {
    apps: [
        {
            env_production: {
                NODE_ENV: "production",
                NEXT_TELEMETRY_DISABLED: "1",
            },
        },
    ],
};

3.4 HOSTNAME 바인딩 원칙

운영 환경에서 Next.js 프론트엔드 서버 런타임은 외부에 직접 노출되지 않으며,
Nginx 뒤에서 내부 인터페이스로만 바인딩됨.

이를 위해 실행 시 바인딩 주소를 명시적으로 제한함.

HOSTNAME=127.0.0.1
  • 127.0.0.1 또는 내부 전용 IP 사용
  • 0.0.0.0 바인딩은 특별한 사유 없이는 사용하지 않음

운영 기준

  • Next.js 런타임은 내부 인터페이스로만 바인딩
  • 외부 트래픽은 반드시 Nginx를 통해서만 유입
  • 방화벽에서 Next.js 포트는 열지 않음

허용 / 비허용 기준

설정 값 허용 여부 설명
127.0.0.1 ⭕ 허용 로컬 루프백, 운영 표준
내부 전용 IP ⭕ 허용 내부 네트워크 구성 시
0.0.0.0 ❌ 비권장 외부 노출 위험

PM2 적용 예시 (운영 권장)

// ecosystem.config.cjs
module.exports = {
    apps: [
        {
            env_production: {
                NODE_ENV: "production",
                HOSTNAME: "127.0.0.1"
            },
        },
    ],
};

HOSTNAME을 명시하지 않으면
실행 환경에 따라 바인딩 주소가 달라질 수 있으므로
운영 환경에서는 반드시 고정함.


4. 메모리 관련 런타임 옵션

Next.js 프론트엔드 서버 런타임은 다음 특성으로 인해
일반적인 Node.js API 서버보다 메모리 피크가 더 자주 발생할 수 있음.

  • SSR 렌더링
  • 이미지 최적화(Sharp 등)
  • 빌드 산출물 로딩

따라서 운영 환경에서는 --max-old-space-size 설정을 반드시 검토해야 함.

4.1 max_old_space_size

--max-old-space-size=1024

(단위: MB)

적용 기준 예시

서버 메모리 권장 값
2GB 512
4GB 1024
8GB 2048

미설정 시 발생 가능한 문제

  • 메모리 여유가 있어도 OOM 발생
  • SSR 중 갑작스러운 프로세스 종료
  • 원인 로그 없이 서비스 중단

설정 방법

  1. node 직접 실행 (테스트/임시)
node --max-old-space-size=1024 node_modules/next/dist/bin/next start
  • 테스트 또는 임시 실행 용도로 사용함

  • PM2 CLI 실행 (비권장)

pm2 start node_modules/next/dist/bin/next \
  --name nextjs-app \
  --node-args="--max-old-space-size=1024" \
  -- start
  1. PM2 ecosystem 설정 (운영 표준)
module.exports = {
  apps: [
    {
      name: "nextjs-frontend",
      script: "node_modules/next/dist/bin/next",
      args: "start",
      node_args: "--max-old-space-size=1024",
      exec_mode: "fork",
      instances: 1
    }
  ]
};
  1. NODE_OPTIONS 환경 변수 방식
export NODE_OPTIONS="--max-old-space-size=1024"
  • 서버 내 모든 Node.js 프로세스에 적용됨
  • 빌드/배치 작업에도 영향 주므로 주의함

운영 기준

  • 서버 전체 메모리의 50~60% 이내로 설정
  • PM2 cluster 모드 사용 시
    총 메모리 ÷ 인스턴스 수 기준으로 인스턴스별 산정

  • 설정 적용 여부는 다음 명령으로 확인함

pm2 describe <app_name>

또는

ps aux | grep node

5. 예외(Exception) 처리 기준

5.1 uncaughtException / unhandledRejection

운영 환경에서 다음 패턴은 허용하지 않음.

  • 예외를 삼켜서 프론트엔드 서버 런타임을 계속 유지하는 구조
  • 로그만 남기고 정상 동작처럼 처리하는 방식

운영 원칙

치명적인 예외 발생 시 프로세스는 종료되어야 함
재시작은 PM2가 담당함

이유:

  • 깨진 상태의 SSR 프로세스는 더 큰 장애를 유발
  • 렌더링 결과 불일치 및 사용자 경험 악화

6. 로그 출력 기준

6.1 stdout / stderr 사용

운영 환경에서는:

  • 애플리케이션에서 파일 직접 기록 ❌
  • stdout / stderr 출력 ⭕
  • 로그 수집은 PM2 / systemd / 외부 로거가 담당

이유

  • 로그 로테이션 중앙화
  • 프론트엔드 서버 장애 분석 일관성 확보
  • 운영 자동화 및 모니터링 연계 용이

7. Next.js 프론트엔드 서버 런타임 실행 형태 (요약)

운영 환경에서 Next.js 프론트엔드 서버 런타임은
다음 구조를 전제로 실행됨.

Nginx
  ↓
PM2
  ↓
Next.js 프론트엔드 서버 런타임 (`next start`, production)

직접 실행 형태는 허용하지 않음.

next start        # ❌ (프로세스 매니저 없이 직접 실행)
node server.js    # ❌

next start는 반드시 PM2 ecosystem 설정으로 관리함.


8. 이 문서에서 의도적으로 다루지 않는 것

다음 항목은 이 문서 범위를 벗어남.

  • PM2 설정 상세
  • 클러스터 모드 구성
  • Nginx 연동
  • CI/CD 파이프라인

각 항목은 별도 문서에서 정의함.


9. 정리

  • Next.js는 프론트엔드 프레임워크이지만
    운영 환경에서는 프론트엔드 서버 런타임으로 동작함
  • 런타임 옵션과 환경 변수는 명시적으로 관리해야 함
  • 암묵적 기본값에 의존하지 않음
  • 실패는 빠르게, 복구는 자동으로

Next.js 프론트엔드 서버 런타임 운영의 기준선임.
이후 모든 실행 방식은 이 기준을 전제로 함.