“λμ μ μ 1λ§ λͺ , 24/7 무μ€λ¨ μ΄μ, λ°°ν¬ν΄λ λκΉ μμ.”
μ΄ μΈ κ°μ§ μꡬμ¬νμ μ½μμ λ μμ§ν λ μ리μΈμ§ μ λͺ°λμ΅λλ€. κ·Έλ₯ μλ² νλ μΌλ©΄ λλ κ±° μλκ°μ? μ΄λ² λ―Έμ μ ν΅ν΄ κ·Έ λ΅μ μ§μ μμΌλ‘ λ§λ€μ΄λ΄€μ΅λλ€. κ²°λ‘ λΆν° λ§νλ©΄, μλ²λ₯Ό μ£½μ§ μκ² λ§λλ 건 μκ°λ³΄λ€ ν¨μ¬ μ κ΅ν μμ μ΄μμ΅λλ€.
π λ―Έμ λ°°κ²½κ³Ό ν΅μ¬ κ³Όμ
μλ리μ€: κ°λ°νμ₯μ΄ λͺ¨λ°μΌ μ± μΆμλ₯Ό μλκ³ REST API μλ² κ΅¬μΆμ μμ²νμ΅λλ€. 1λ§ λͺ λμ μ μ, 24/7 μ΄μ, 무μ€λ¨ λ°°ν¬κ° μꡬμ¬νμ λλ€.
μ΄λ²μ μμ κΈ°μ μ€νμ μ΄λ μ΅λλ€.
| κΈ°μ | μν | λΉμ |
|---|---|---|
| Node.js + Express | API μλ² μμ§ | μ£Όλ°© |
| PM2 (Cluster Mode) | νλ‘μΈμ€ κ΄λ¦¬μ | μ£Όλ°©μ₯ β μλ¦¬μ¬ μ¬λΏμ κ΄λ¦¬ |
| Nginx (Reverse Proxy) | λ‘λλ°Έλ°μ | ν λ§€λμ β μλμ λΉ ν μ΄λΈλ‘ μλ΄ |
| Redis | κ³ μ λ©λͺ¨λ¦¬ μ μ₯μ | 쑰리λ μ μ¬λ£ν΅ β λΉ λ₯Έ 곡μ λ°μ΄ν° |

Step 1: Node.js μ€μΉ π¦
μ΅μ λ²μ (v20)μ μ€μΉνκΈ° μν΄ NodeSource μ μ₯μλ₯Ό λ¨Όμ λ±λ‘ν©λλ€.
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install nodejs -y
npm(ν¨ν€μ§ λ§€λμ )λ ν¨κ» μ€μΉλ©λλ€.


Step 2: Express API μλ² κ΅¬ν βοΈ
API μλ² μ½λκ° λ€μ΄κ° λλ ν°λ¦¬λ₯Ό λ§λ€κ³ , νμν ν¨ν€μ§λ₯Ό μ€μΉν©λλ€.
sudo mkdir -p /opt/techflow-api
cd /opt/techflow-api
npm init -y
npm install express cors helmet compression morgan dotenv


ν΅μ¬ νμΌμ λ κ°μ λλ€.
app.js β μλ² κ·Έ μ체μ
λλ€. μμ²μ λ°κ³ μ²λ¦¬νλ λͺ¨λ λ‘μ§μ΄ μ¬κΈ°μ μμ΅λλ€.
/health: μλ²κ° μ΄μμλμ§ νμΈ (λ‘λλ°Έλ°μκ° μ£ΌκΈ°μ μΌλ‘ 체ν¬)/api/users: μ¬μ©μ λͺ©λ‘ μ‘°νPOST /api/users: μ κ· μ¬μ©μ μΆκ°
.env β νκ²½ λ³μ νμΌμ
λλ€. ν¬νΈ λ²νΈλ DB μ£Όμμ²λΌ νκ²½λ§λ€ λ¬λΌμ§λ κ°μ μ½λμ λΆλ¦¬ν΄μ κ΄λ¦¬ν©λλ€.


μ¬μ©μ λͺ©λ‘ μ‘°ν λ° λ°μ΄ν° μΆκ° ν μ€νΈ


ν μ€νΈκ° λλλ©΄ λ°λμ νλ‘μΈμ€λ₯Ό μ’ λ£ν΄μΌ ν©λλ€. λ€μ λ¨κ³μμ PM2κ° λμ κ΄λ¦¬ν κ±°λΌμ, μ§κΈ μΌλ κ²κ³Ό μΆ©λμ΄ λ©λλ€.
Step 3: PM2 ν΄λ¬μ€ν° λͺ¨λ β μ½μ΄λ₯Ό μ λΆ μ¨λΌ! π₯οΈ
Node.jsλ μ±κΈ μ€λ λμ λλ€. μ무리 μ’μ μλ²μ¬λ CPU μ½μ΄ νλλ§ μλλ€. 1λ§ λͺ μ΄ λμμ λ€μ΄μ€λ©΄? μ€μ΄ μμ² κΈΈμ΄μ§μ£ .
PM2 ν΄λ¬μ€ν° λͺ¨λλ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€. CPU μ½μ΄ μλ§νΌ Node.js νλ‘μΈμ€λ₯Ό 볡μ ν΄μ λ³λ ¬λ‘ μ²λ¦¬ν©λλ€.
npm install -g pm2
μ€μ νμΌ ecosystem.config.jsλ₯Ό λ§λ€μ΄ PM2μκ² μλ² κ΄λ¦¬ λ°©λ²μ μλ €μ€λλ€.
module.exports = {
apps: [{
name: 'techflow-api',
script: 'app.js',
instances: 'max', // CPU μ½μ΄ μλ§νΌ μλ 볡μ
exec_mode: 'cluster', // ν΄λ¬μ€ν° λͺ¨λ νμ±ν
max_memory_restart: '500M',
env_production: {
NODE_ENV: 'production',
PORT: 3000
}
}]
};
PM2 ν΄λ¬μ€ν° λͺ¨λ μ€ν νλ©΄


λ‘λλ°Έλ°μ± κ²μ¦ β CPUλ³ μμ² λΆμ° νμΈ

PM2λ₯Ό μμ€ν μλΉμ€λ‘ λ±λ‘νλ©΄ μλ²κ° μ¬λΆν λμ΄λ μλμΌλ‘ μμλ©λλ€.
PM2 μμ€ν μλΉμ€ λ±λ‘ νλ©΄

Step 4: Nginx λ‘λλ°Έλ°μ β κ΅ν΅ μ 리μ λ¬μΈ π
PM2κ° μ¬λ¬ νλ‘μΈμ€λ₯Ό κ΄λ¦¬νμ§λ§, μΈλΆμμλ μ¬μ ν νΉμ ν¬νΈλ‘λ§ μ μν©λλ€. Nginxκ° λ¦¬λ²μ€ νλ‘μ μν μ ν΄μ λ€μ΄μ€λ μμ²μ κ°μ₯ μ¬μ λ‘μ΄ νλ‘μΈμ€μ λ겨μ€λλ€.
upstream techflow_backend {
least_conn; # μ°κ²°μ΄ κ°μ₯ μ μ μλ² μ°μ
server 127.0.0.1:3000;
keepalive 64;
}
SSL μΈμ¦μλ Nginxμμ μ²λ¦¬νμ¬, μ€μ Node.js μλ²λ μνΈν λΆλ΄ μμ΄ λΉμ¦λμ€ λ‘μ§μλ§ μ§μ€ν μ μμ΅λλ€.
Nginx μ€μ νμΌ μμ± νλ©΄

λ‘λλ°Έλ°μ λμ ν μ€νΈ κ²°κ³Ό

Step 5: Redis + 무μ€λ¨ λ°°ν¬ ν μ€νΈ π
Redisλ μ¬λ¬ Node.js νλ‘μΈμ€ κ°μ μΈμ μ΄λ μΊμ λ°μ΄ν°λ₯Ό 곡μ νκΈ° μν΄ μ€μΉν©λλ€. λ©λͺ¨λ¦¬μμ λμν΄μ DBλ³΄λ€ ν¨μ¬ λΉ λ¦ λλ€.
Redis μ€μΉ λ° νμΈ, λ°μ΄ν° μ μ₯ ν μ€νΈ



μ΄μ κ°μ₯ μ€μν ν μ€νΈμ λλ€. 무μ€λ¨ λ°°ν¬(Zero-Downtime Deployment) β μλΉμ€ μ€μ μ½λλ₯Ό λ°κΏλ μ¬μ©μλ λκΉμ λλΌμ§ λͺ»νλ κ±°μ£ .
ν°λ―Έλ λ κ°λ₯Ό μ΄μ΄μ λμμ μ§νν©λλ€.
ν°λ―Έλ 1: 0.5μ΄λ§λ€ μλ²μ μμ²μ 보λ΄λ©° μλ΅μ λͺ¨λν°λ§ν©λλ€.
while true; do
result=$(curl -sk https://api.techflow.local/health 2>/dev/null)
echo "$(date '+%H:%M:%S') - OK - $(echo $result | grep -o '"pid":[0-9]*')"
sleep 0.5
done
ν°λ―Έλ 2: PM2λ₯Ό ν΅ν΄ 무μ€λ¨ μ¬μμ λͺ λ Ήμ λ 립λλ€.
pm2 reload techflow-api
무μ€λ¨ λ°°ν¬ λͺ¨λν°λ§ νλ©΄

μ¬μμ μ ν PID λ³κ²½ νμΈ


μ¬μμ μ 5879, 5892μ΄λ PIDκ° μ¬μμ ν 5979, 6298λ‘ λ°λμμ§λ§, λͺ¨λν°λ§ νλ©΄μλ FAILμ΄ ν λ²λ μμμ΅λλ€. μ±κ³΅μ
λλ€!
π μ΅μ’ μ κ²
node -v # Node.js μ€μΉ νμΈ
pm2 status | grep "online" # PM2 μ μ μ€ν
systemctl is-active nginx # Nginx μ€ν μ€
curl -sk https://api.techflow.local/health # HTTPS μλ΅ νμΈ
redis-cli ping # PONG μλ΅ νμΈ
μ΅μ’ μ κ² μ€ν κ²°κ³Ό νλ©΄

π‘ λ―Έμ μ λ§μΉλ©°
μ΄λ² λ―Έμ μ ν΅μ¬ λ©μμ§λ νλμ λλ€.
μλ² νλλ‘λ λΆμ‘±νλ€. μ μ€κ³λ κ΅¬μ‘°κ° μμ΄μΌ λκ·λͺ¨ νΈλν½μ λ²νΈ μ μλ€.
Node.js(μ£Όλ°©) + PM2(μ£Όλ°©μ₯) + Nginx(ν λ§€λμ ) + Redis(곡μ μ¬λ£ν΅)μ μ‘°ν©μ, λ¨μν μλ² νλλ³΄λ€ ν¨μ¬ κ°λ ₯νκ³ νλ ₯μ μΈ μμ€ν μ λ§λ€μ΄λ λλ€. νΉν 무μ€λ¨ λ°°ν¬λ₯Ό μ§μ λμΌλ‘ νμΈνμ λμ κ°λμ μμ§λ κΈ°μ΅λ©λλ€. “μ, μ΄λμ PM2λ₯Ό μ°λꡬλ!” π