Skip to main content

Dockder Container 안에서 pm2로 next.js 실행하는 방법

node 런타임 기반의 next.js를 돌리기 위해서 싱글스레드 기반인 node.js를 사용한다.

하지만 노드의 경우 싱글스레드이기 때문에, 트래픽이 많은 환경에서는 멀티 코어를 사용해서 노드앱을 실행할 필요가 있다.

다음의 방법이 있는데, cluster 방법이 가장 편한 방식이고, 이를 더 편하게 사용하기 위해 pm2의 cluster 모드를 사용하는 것이 좋아보임

  • worker thread
  • child process
  • cluster
// ./ecosystem.config.js

module.exports = {
apps: [
{
name: "next-app",
script: "node_modules/next/dist/bin/next",
args: "start --port 80",
instances: 2,
exec_mode: "cluster",
},
],
};
// package.json

{
"script": {
// pm2-runtime 실행 전 pm2 list를 실행해서 pm2가 초기화 되어 올바른 경로를 설정함

// pm2를 컨테이너에서 실행하려면 pm2가 아닌 pm2-runtime으로 start해주어야함
// "start-pm2:dev": "pm2-runtime start ecosystem.config.js"
"start-pm2:dev": "pm2 list && pm2-runtime start ecosystem.config.js"
}
}
// Dockerfile

# Stage 0
FROM node AS nextjs-builder

# next.js 빌드
WORKDIR /home/deploy/next
COPY ./package.json ./package.json
COPY ./package-lock.json ./package-lock.json
RUN npm ci
COPY ./ecosystem.config.js ./ecosystem.config.js
COPY ./.env ./.env
COPY ./next.config.js ./next.config.js
COPY ./public ./public
COPY ./src ./src
RUN npm run build

# 프로젝트 실행
ENTRYPOINT ["npm", "run", "start-pm2:dev"]
ready - started server on 0.0.0.0:80, url: http://localhost:80
info - Loaded env from /home/develop/deploy/next/.env
ready - started server on 0.0.0.0:80, url: http://localhost:80
info - Loaded env from /home/develop/deploy/next/.env

참고

container 안에서 pm2로 next.js 앱 실행하기