הגדרת PM2 לסביבת ייצור של Node.js: קלאסטר, אפס זמן השבתה, הפעלה אוטומטית

האם תהליך ה-Node.js שלך קרס באמצע הלילה, ורק לקוחות גילו לך? ללא מנהל תהליכים אמין, הסביבה היצרנית הופכת להימור. אנו מגדירים PM2 במתכונת turnkey: clustering, zero-downtime reload, auto-start וניטור—כך שהאפליקציה שלך רצה ביציבות 24/7. הצוות שלנו מטפל בכל מחזור ההטמעה ומספק תמיכה מתמשכת.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

ניהול תהליכי Node.js עם PM2: הגדרה מוכנה לייצור

תהליך ה-Node.js שלך קרס באמצע הלילה, וגילית על כך רק מהלקוחות — סיפור מוכר? ללא מנהל תהליכים, הייצור הופך להימור. בשרת ייצור המריץ Node.js, היעדר PM2 הופך כל קריסה לאירוע חירום. תחת עומס של 10k RPS, היעדר מנהל תהליכים מבטיח השבתה. אנו מגדירים את PM2 מאפס ועד מוכנות לייצור: קלאסטרינג, טעינה מחדש ללא השבתה, הפעלה אוטומטית, ניטור ו-logrotate. התוצאה: פעילות יציבה 24/7 עם זמינות של 99.95% ומאמץ תפעולי מינימלי. הצוות שלנו ביצע למעלה מ-50 התקנות PM2 מוצלחות לפרויקטים המטפלים בין 1000 ל-100k RPS. חיסכון בעלויות תשתית מגיע ל-30% באמצעות ניצול משאבים יעיל. עלות הגדרת יישום בודד נקבעת לאחר ניתוח — צור קשר לבדיקת תשתית.

בעיות שאנו פותרים

  • קריסות תהליך אקראיות — PM2 מפעיל מחדש עובד שנכשל תוך שניות. סטטיסטיקות מראות שזמינות עם שחזור אוטומטי מגיעה ל-99.95%.
  • צורך בעדכונים ללא השבתה — טעינה מחדש ללא השבתה מאפשרת עדכוני קוד ללא הפרעה בשירות, וחוסכת עד 40% מזמן הפריסה (לפי תיעוד PM2).
  • חוסר ניטור — מדדי CPU/RAM מובנים והתראות כאשר חריגים מהמגבלות. אנו משתלבים עם Prometheus לניטור מרכזי.
  • הפעלה אוטומטית שנשכחה — לאחר אתחול שרת, תהליכים לא מתחילים, ומאלצים התערבות ידנית. הגדרת יחידת systemd הופכת זאת לאוטומטי.

כיצד אנו מגדירים PM2: מקרה אמיתי

קחו פרויקט של לקוח: שרת API מסוג Express ועובד רקע לעיבוד משימות. אנו משתמשים ב-ecosystem.config.js — הגישה המוכנה לייצור.

// ecosystem.config.js
module.exports = {
  apps: [
    {
      name: 'api-server',
      script: './src/server.js',
      instances: 'max',
      exec_mode: 'cluster',
      watch: false,
      max_memory_restart: '512M',
      env: {
        NODE_ENV: 'development',
        PORT: 3000,
      },
      env_production: {
        NODE_ENV: 'production',
        PORT: 3000,
      },
      log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
      error_file: '/var/log/pm2/api-error.log',
      out_file: '/var/log/pm2/api-out.log',
      merge_logs: true,
    },
    {
      name: 'worker',
      script: './src/worker.js',
      instances: 2,
      exec_mode: 'fork',
      cron_restart: '0 3 * * *',
      max_memory_restart: '256M',
    }
  ]
};

התחילו עם: // ecosystem.config.js module.exports = { apps: [ { name: 'api-server', script: './src/server.js', instances: 'max', exec_mode: 'cluster', watch: false, max_memory_restart: '512M', env: { NODE_ENV: 'development', PORT: 3000, }, env_production: { NODE_ENV: 'production', PORT: 3000, }, log_date_format: 'YYYY-MM-DD HH:mm:ss Z', error_file: '/var/log/pm2/api-error.log', out_file: '/var/log/pm2/api-out.log', merge_logs: true, }, { name: 'worker', script: './src/worker.js', instances: 2, exec_mode: 'fork', cron_restart: '0 3 * * *', max_memory_restart: '256M', } ] }; .

pm2 start ecosystem.config.js --env production יוצר עובד אחד לכל ליבת CPU. במצב קלאסטר, PM2 פועל כמאזן עומסים — הוא מחלק בקשות נכנסות בין העובדים. חשוב: היישום חייב להיות חסר מצב. אם אתם משתמשים בסשנים, אחסנו אותם ב-Redis או במסד נתונים.

instances: 'max' משמש כמגבלה הגיונית: התהליך מופעל מחדש כאשר RSS חורג מהסף. זה לא תרופה לדליפות זיכרון, אבל זה קונה זמן למציאת שורש הבעיה ללא OOM killer. הלקוח הפחית את עלויות תשתית השרת ב-30% באמצעות ניצול משאבים יעיל.

טעינה מחדש ללא השבתה

הפקודה max_memory_restart מפעילה מחדש עובדים אחד אחד, וממתינה שכל אחד יפלוט אות מוכנות. בקוד שלך, הוסיפו:

// После успешного старта HTTP-сервера process.send('ready'); 

אם תשמיטו זאת, PM2 משתמש ב-timeouts ברירת מחדל — הטעינה מחדש עדיין תתרחש, אך ייתכן אובדן בקשות. אנו תמיד מגדירים מוכנות מפורשת.

הפעלה אוטומטית לאחר אתחול

pm2 start ecosystem.config.js --env production pm2 save pm2 startup # выполнить сгенерированную команду с sudo 

PM2 יוצר יחידת systemd שמפעילה את כל התהליכים השמורים בעת אתחול המערכת. נבדק על Ubuntu, CentOS ו-Debian.

השוואה: Fork לעומת Cluster

פרמטר Fork Cluster
מצב ביצוע תהליך יחיד עובדים מרובים
איזון עומסים לא כן (round-robin)
בידוד תהליכים נמוך גבוה
צריכת זיכרון מינימלית בינונית
מקרה שימוש עובד רקע, cron שרת HTTP

השוואה: systemd לעומת PM2 להפעלה אוטומטית

קריטריון systemd PM2 + systemd
מורכבות הגדרה בינונית נמוכה (אוטומטית)
תמיכה במצב קלאסטר לא מובנית
טעינה מחדש ללא השבתה דורש סקריפט מובנית
ניטור journalctl pm2 monit

PM2 עם systemd מהיר פי 3 בזמן פריסה.

התהליך שלנו

אנו ניגשים להגדרה בשלבים:

  1. ניתוח — סקירת ארכיטקטורת היישום, העומס והדרישות.
  2. עיצוב — קביעת מספר עובדים, מגבלות זיכרון, הגדרות לוג.
  3. יישום — יצירת ecosystem.config.js, הגדרת הפעלה אוטומטית ו-logrotate.
  4. בדיקות — אימות טעינה מחדש ללא השבתה, failover וניטור.
  5. פריסה — פריסה לסטייג'ינג, ולאחר מכן לייצור.

לוחות זמנים ועלות

הגדרת PM2 ליישום אחד אורכת בין 2 ל-5 ימים תלוי במורכבות. העלות המדויקת מחושבת לאחר בדיקת התשתית שלך. צור קשר להערכת פרויקט.

מה כלול

  • פריסת PM2 עם ecosystem.config.js
  • מצב קלאסטר עם מספר עובדים אופטימלי
  • טעינה מחדש ללא השבתה עם אות מוכנות
  • הפעלה אוטומטית דרך systemd
  • הגדרת logrotate לסיבוב לוגים
  • ניטור בסיסי (pm2 monit, מדדי Prometheus)
  • תיעוד תפעולי
  • שעתיים של תמיכה טכנית לאחר המסירה

למה להשתמש במצב קלאסטר?

מצב קלאסטר משפר משמעותית את האמינות: אם עובד אחד נכשל, האחרים ממשיכים לטפל בבקשות. מניסיוננו, זמינות ליישומים מקובצים מגיעה ל-99.9%. זה קריטי במיוחד לשירותים בעלי זמינות גבוהה.

כיצד להגדיר logrotate עבור PM2?

ללא סיבוב, הלוגים ממלאים את הדיסק תוך שבוע. הוסיפו קובץ pm2 reload api-server:

/var/log/pm2/*.log { daily rotate 7 compress delaycompress missingok notifempty copytruncate } 

זה חוסך עד 80% משטח הדיסק.

טעויות נפוצות בהגדרת PM2
  • שכחת // После успешного старта HTTP-сервера process.send('ready'); — דליפת זיכרון עלולה לגרום לקריסה ללא הפעלה מחדש בזמן.
  • אין logrotate — הלוגים ממלאים את הדיסק, והשרת מפסיק לעבוד.
  • שימוש ב-pm2 start ecosystem.config.js --env production pm2 save pm2 startup # выполнить сгенерированную команду с sudo ללא קובץ ecosystem — מאבדים את הגדרות הסביבה והמצב.
  • דילוג על /etc/logrotate.d/pm2 ו-/var/log/pm2/*.log { daily rotate 7 compress delaycompress missingok notifempty copytruncate } — לאחר אתחול, יש להפעיל תהליכים ידנית.

אנו מבטיחים שאחרי ההגדרה שלנו, תוכלו לישון בשקט — היישום שלך ישחזר את עצמו מכל תקלה. בקשו בדיקת תשתית Node.js על ידי יצירת קשר.

PM2 GitHub