TIL/Node.js, express

Node.js/Express) PM2 ์‚ฌ์šฉ๋ฒ•, ์ฝ”์–ด์™€ ์“ฐ๋ ˆ๋“œ <TIL_2022_08_05>

Dev_to_freedom 2022. 8. 5. 17:48

1. PM2

[NODE] ๐Ÿ“š PM2 ๋ชจ๋“ˆ ์‚ฌ์šฉ๋ฒ• - ํด๋Ÿฌ์Šคํ„ฐ / ๋ฌด์ค‘๋‹จ ์„œ๋น„์Šค

  • pm2๋Š” node.js ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Process Manager์ž„
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ node.js๋ฅผ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ.
  • pm2 start ์„ค์ • ํŒŒ์ผ ๋ช…(๋ณดํ†ต ecosystem.config.js)์œผ๋กœ ์‹คํ–‰
  • ๋งŒ์•ฝ ์„œ๋ฒ„๊ฐ€ 8์ฝ”์–ด 16์Šค๋ ˆ๋“œ๋ผ๋ฉด, ์ตœ๋Œ€ 16๊ฐœ ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋…ธ๋“œ๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ™œ์šฉ์„ ๋ชปํ•˜๋Š” ๋ฌธ์ œ → ‘ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“ˆ'์„ ํ†ตํ•ด ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋กœ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๋‹ค. (๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค์—์„œ ์ฝ”์–ด ์ˆ˜๋งŒํผ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ชจ๋“  ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•จ.)
  • ๊ทธ๋Ÿฌํ•œ ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“ˆ์˜ ๊ด€๋ฆฌ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ๋Š”๊ฒŒ pm2

 

 

pm2์˜ ๊ธฐ๋Šฅ

  • ์„œ๋น„์Šค ์„œ๋ฒ„๊ฐ€ ์ค‘์ง€๋ผ๋„ ๋‹ค์‹œ ์ผœ์คŒ
  • ๋ฉ€ํ‹ฐ์ฝ”์–ด, ํ•˜์ดํผ ์Šค๋ ˆ๋”ฉ ์ง€์›
  • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์ด ์˜ฌ๋•Œ ์š”์ฒญ์„ ์•Œ์•„์„œ ์—ฌ๋Ÿฌ ๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค์— ๋ถ„๋ฐฐ (๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ)
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋จ → ๋ฌด์ค‘๋‹จ ์„œ๋น„์Šค

 

pm2 ๊ฐœ๋ฐœ/๋ฐฐํฌ ํ™˜๊ฒฝ ์‹คํ–‰ ๋ถ„๋ฆฌ

apps: [
    {
      // ๋ฐฐํฌ ํ™˜๊ฒฝ์šฉ ์„œ๋ฒ„
      name: "superconnector-prod",
      script: "./app.js",
      instances: "-1",
      exec_mode: "cluster", // ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ. default="fork"
      env_prod: {
        NODE_ENV: "production",
        PORT: 3000,
      },
    },
    {
		// ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์šฉ ์„œ๋ฒ„
      name: "superconnector-dev",
      script: "./app.js",
      instances: "1", // ๋‹จ์ผ ์Šค๋ ˆ๋“œ
      exec_mode: "cluster",
      env_dev: {
        NODE_ENV: "development",
        PORT: 3000,
      },
    },
  ],

ecosystem.config.js์— ์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•œ ํ›„, package.json ํŒŒ์ผ์—์„œ scripts ์˜์—ญ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•œ๋‹ค.

 

"scripts": {
    "start": "pm2 start ecosystem.config.js --only superconnector-prod --env=prod",
    "test": "echo \\"Error: no test specified\\" && exit 1",
    "dev": "pm2 start ecosystem.configjs --only superconnector-dev --env=dev"
  },

—only : ecosystem.config.js ํŒŒ์ผ์—์„œ name๊ฐ’์„ ์ง€์ •ํ•ด์„œ ์‹คํ–‰

—env : env์„ค์ •๋“ค์„ ์‹คํ–‰

 

 

์ดํ›„ ์‰˜์—์„œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค.

npm start : ๋ฐฐํฌ ํ™˜๊ฒฝ์œผ๋กœ pm2 ์‹คํ–‰

npm run dev : ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ pm2 ์‹คํ–‰

 

 

 

 

 

2. ์ฝ”์–ด, ์“ฐ๋ ˆ๋“œ

์ฝ”์–ด

  • CPU์˜ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ค‘์‹ฌ๋ถ€
  • ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌ
  • ๋“€์–ผ์ฝ”์–ด, ์ฟผ๋“œ์ฝ”์–ด ๋“ฑ ์ฝ”์–ด๋ฅผ ๋Š˜๋ฆผ์œผ๋กœ์จ ๋” ๋งŽ์€ ์—ฐ์‚ฐ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅ

์“ฐ๋ ˆ๋“œ

  • ์ฝ”์–ด๊ฐ€ ๋ฌผ๋ฆฌ์ ์ธ ๊ฐœ๋…์ด๋ผ๋ฉด ์“ฐ๋ ˆ๋“œ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ ์ธ ๊ฐœ๋…
  • ex) ์ธํ…”์˜ ๊ฒฝ์šฐ ํ•˜์ดํผ์“ฐ๋ ˆ๋”ฉ์ด๋ผ๋Š” ๊ธฐ์ˆ ๋กœ ์ฝ”์–ด์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ฐ˜์œผ๋กœ ์ชผ๊ฐœ ์ž‘์—…์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋Š˜๋ฆผ

ํ•˜์ดํผ ์“ฐ๋ ˆ๋”ฉ

: ํ•˜๋‚˜์˜ ์ฝ”์–ด์— ์“ฐ๋ ˆ๋“œ๋ฅผ ๋‘ ๊ฐœ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ.