[PM2] Process Manager 2
π κ°μ
PM2λ Node.js κΈ°λ°μ νλ‘μΈμ€ λ§€λμ λ‘, λ€μν μ ν리μΌμ΄μ μ μμ½κ² κ΄λ¦¬ν μ μλλ‘ λμμ€λλ€. μλ μ¬μμ, λ‘κ·Έ κ΄λ¦¬ λ±μ κΈ°λ₯μ μ 곡νμ¬ μμ μ μΈ μλΉμ€ μ΄μμ΄ κ°λ₯ν©λλ€. νΉν, λ°°ν¬ λ° μ΄μ νκ²½μμ νλ‘μΈμ€ μ μ§μ λͺ¨λν°λ§μ κ°νΈνκ² ν μ μμ΄ λ§μ΄ μ¬μ©λ©λλ€.
π νμ©
1οΈβ£ νλ‘μΈμ€ κ΄λ¦¬
PM2λ μ ν리μΌμ΄μ μ λ°±κ·ΈλΌμ΄λμμ μ€ννκ³ , μλ μ¬μμ λ° λ€μ€ μΈμ€ν΄μ€ μ€ν κΈ°λ₯μ μ 곡ν©λλ€.
pm2 start app.js --name myApp --instances 4 # 4κ°μ μΈμ€ν΄μ€λ‘ μ€ν
pm2 restart myApp # μ ν리μΌμ΄μ
μ¬μμ
pm2 stop myApp # μ ν리μΌμ΄μ
μ€μ§
β μ₯μ : μλ²κ° μκΈ°μΉ μκ² μ’ λ£λμ΄λ μλμΌλ‘ λ€μ μ€νλ¨.
2οΈβ£ νλ‘μΈμ€ μ€ν μμ κ΄λ¦¬
PM2λ restart_delayμ wait_ready μ΅μ μ νμ©νμ¬ μ€ν μμλ₯Ό μ‘°μ ν μ μμ΅λλ€.
module.exports = {
apps: [
{ name: "DB Service", script: "db-service.js", wait_ready: true },
{ name: "API Server", script: "api.js", restart_delay: 5000 },
{ name: "Worker", script: "worker.js", restart_delay: 10000 }
]
};
β μ₯μ : DBκ° λ¨Όμ μ€νλκ³ , API μλ² λ° Workerκ° μμ°¨μ μΌλ‘ μ€νλ¨.
3οΈβ£ νλ‘μΈμ€ 볡ꡬ (μλ μ¬μμ λ° μ¬λΆν μ μ€ν)
PM2λ νλ‘μΈμ€κ° λΉμ μ μ’ λ£λλλΌλ μλμΌλ‘ μ¬μμνλ κΈ°λ₯μ΄ μμ΅λλ€.
pm2 startup # μλ² λΆν
μ PM2 μλ μ€ν μ€μ
pm2 save # νμ¬ μ€ν μ€μΈ νλ‘μΈμ€λ₯Ό μ μ₯
pm2 resurrect # μ μ₯λ νλ‘μΈμ€λ₯Ό 볡ꡬ
β μ₯μ : μλΉμ€κ° λ€μ΄λμ΄λ μλ 볡ꡬλμ΄ μ₯μ λμμ΄ λΉ λ¦.
4οΈβ£ νλ‘μΈμ€ λ‘κ·Έ λ° μλ¦Ό
PM2λ μ€ν μ€μΈ μ ν리μΌμ΄μ μ λ‘κ·Έ κ΄λ¦¬ λ° μλ¦Ό κΈ°λ₯μ μ§μν©λλ€.
pm2 logs myApp # μ€μκ° λ‘κ·Έ 보기
pm2 flush # λ‘κ·Έ μ΄κΈ°ν
pm2 logrotate # λ‘κ·Έ μλ μμΆ λ° μμ
β μ₯μ : λ‘κ·Έλ₯Ό μ½κ² κ΄λ¦¬νκ³ , μλ² κ³ΌλΆνλ₯Ό λ°©μ§ν μ μμ.
5οΈβ£ PM2μ λ¨μ λ° μ νμ¬ν
- λ©λͺ¨λ¦¬ μ¬μ©: PM2 μμ²΄κ° νλ‘μΈμ€λ₯Ό κ°μνλ Daemonμ΄λ―λ‘ λ©λͺ¨λ¦¬λ₯Ό μΆκ°λ‘ μ¬μ©ν¨.
- νλ‘μΈμ€ μμ‘΄μ± κ΄λ¦¬ λΆμ‘±: μ€ν μμλ₯Ό κ°μ ν λ°©λ²μ΄ μ νμ μ΄λ©°, pm2 start --only λ± μλ μ€μ μ΄ νμν¨.
- λ§μ΄ν¬λ‘μλΉμ€ νκ²½μμλ νκ³: Docker, Kubernetes κ°μ 컨ν μ΄λ μ€μΌμ€νΈλ μ΄μ ν΄μ΄ λ μ μ©ν¨.
π κ²°λ‘
PM2λ μλΉμ€ μμ μ±μ λμ΄κ³ , μ΄μμ κ°μννλ κ°λ ₯ν νλ‘μΈμ€ λ§€λμ μ
λλ€.
μλ μ¬μμ, λ‘κ·Έ κ΄λ¦¬, μ€ν μμ μ μ΄ λ±μ κΈ°λ₯μ νμ©νλ©΄ μ₯μ λμμ΄ μ¬μμ§κ³ μ΄μ λΆλ΄μ΄ μ€μ΄λλλ€.
νΉν, μμ κ·λͺ¨μ μλΉμ€λ λ¨μΌ μλ² νκ²½μμ ν¨κ³Όμ μ΄λ©°, μ΄μμμ κ°μ
μμ΄ μμ μ μΈ μλΉμ€λ₯Ό μ 곡ν μ μμ΅λλ€. π