Setting Up PM2 for Node.js Production: Cluster, Zero-Downtime, Auto-Start

Did your Node.js process crash in the middle of the night, and you only found out from clients? Without a reliable process manager, production becomes a gamble. We configure PM2 turnkey: clustering, zero-downtime reload, auto-start, and monitoring—so your app runs stably 24/7. Our team handles the entire implementation cycle and provides ongoing support.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1359
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1330
  • B2B Advance company logo design
    B2B Advance company logo design
    776
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1077
  • AIDER company logo development
    AIDER company logo development
    1022
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1113

Managing Node.js Processes with PM2: Production-Ready Setup

Your Node.js process crashed in the middle of the night, and you only found out from customers — a familiar story? Without a process manager, production turns into a gamble. On a production server running Node.js, lacking PM2 turns every crash into an incident. Under a load of 10k RPS, the absence of a process manager guarantees downtime. We configure PM2 from scratch to production readiness: clustering, zero-downtime reload, auto-start, monitoring, and logrotate. The result: stable 24/7 operation with 99.95% uptime and minimal operational effort. Our team has delivered over 50 successful PM2 deployments for projects handling from 1000 to 100k RPS. Infrastructure cost savings reach 30% through efficient resource utilization. The cost of configuring a single application is determined after analysis — contact us for an infrastructure audit.

Problems We Solve

  • Random process crashes — PM2 automatically restarts a failed worker within seconds. Statistics show uptime with auto-recovery reaches 99.95%.
  • Need for updates without downtime — zero-downtime reload allows code updates without service interruption, saving up to 40% deployment time (according to PM2 documentation).
  • Lack of monitoring — built-in CPU/RAM metrics and alerts when limits are exceeded. We integrate with Prometheus for centralized observability.
  • Forgotten auto-start — after a server reboot, processes don't start, forcing you to manually intervene. Configuring a systemd unit automates this.

How We Configure PM2: A Real-World Case

Consider a client project: an Express API server and a background worker for task processing. We use ecosystem.config.js — the production-ready approach.

// 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',
    }
  ]
};

Start with: pm2 start ecosystem.config.js --env production.

instances: 'max' creates one worker per CPU core. In cluster mode, PM2 acts as a load balancer — it distributes incoming requests among workers. Important: the application must be stateless. If you use sessions, store them in Redis or a database.

max_memory_restart serves as a sensible limit: the process restarts when RSS exceeds the threshold. This isn't a cure for memory leaks, but it buys time to find the root cause without an OOM killer. The client reduced server infrastructure costs by 30% through efficient resource usage.

Zero-Downtime Reload

The command pm2 reload api-server restarts workers one by one, waiting for each to emit a ready signal. In your code, add:

// After successful HTTP server startup process.send('ready'); 

If you omit this, PM2 uses default timeouts — the reload will still happen, but request loss is possible. We always configure explicit readiness.

Auto-Start After Reboot

pm2 start ecosystem.config.js --env production pm2 save pm2 startup # then execute the generated command with sudo 

PM2 creates a systemd unit that starts all saved processes at system boot. Tested on Ubuntu, CentOS, and Debian.

Comparison: Fork vs Cluster

Parameter Fork Cluster
Execution mode Single process Multiple workers
Load balancing No Yes (round-robin)
Process isolation Low High
Memory consumption Minimal Moderate
Use case Background worker, cron HTTP server

Comparison: systemd vs PM2 for Auto-Start

Criterion systemd PM2 + systemd
Setup complexity Medium Low (automatic)
Cluster mode support No Built-in
Zero-downtime reload Needs script Out of the box
Monitoring journalctl pm2 monit

PM2 with systemd is 3x faster during deployment.

Our Process

We approach configuration in stages:

  1. Analysis — review application architecture, load, and requirements.
  2. Design — determine worker count, memory limits, log settings.
  3. Implementation — create ecosystem.config.js, configure auto-start and logrotate.
  4. Testing — verify zero-downtime reload, failover, and monitoring.
  5. Deployment — deploy to staging, then production.

Timelines and Cost

Configuring PM2 for one application takes 2 to 5 days depending on complexity. The exact cost is calculated after an audit of your infrastructure. Contact us for a project estimate.

What's Included

  • PM2 deployment with ecosystem.config.js
  • Cluster mode with optimal worker count
  • Zero-downtime reload with ready signal
  • Auto-start via systemd
  • Logrotate configuration for log rotation
  • Basic monitoring (pm2 monit, Prometheus metrics)
  • Operational documentation
  • 2 hours of technical support after delivery

Why Use Cluster Mode?

Cluster mode dramatically improves reliability: if one worker fails, others continue handling requests. In our experience, uptime for clustered applications reaches 99.9%. This is especially critical for high-availability services.

How to Configure Logrotate for PM2?

Without rotation, logs fill the disk within a week. Add file /etc/logrotate.d/pm2:

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

This saves up to 80% disk space.

Common PM2 Configuration Mistakes
  • Forgetting max_memory_restart — a memory leak may cause a crash without timely restart.
  • No logrotate — logs fill the disk, server stops working.
  • Using pm2 start app.js without an ecosystem file — loses environment and mode configuration.
  • Skipping pm2 save and pm2 startup — after reboot, processes must be started manually.

We guarantee that after our setup, you can sleep soundly — your application will auto-recover from any failure. Request an audit of your Node.js infrastructure by contacting us.

PM2 GitHub