2核2G服务器运行五个Node.js站点需要优化哪些参数?

在一台 2核2G 内存 的服务器上运行 五个 Node.js 站点,资源相对紧张。为了确保系统稳定、响应良好并避免频繁的内存溢出(OOM)或服务崩溃,必须进行合理的优化。以下是关键的优化建议:


一、Node.js 层面优化

1. 限制每个 Node.js 进程的内存使用

  • 使用 --max-old-space-size 参数控制堆内存上限:
    node --max-old-space-size=300 app.js

    建议每个进程设置为 256–300MB,留出空间给系统和其他进程。

2. 使用 PM2 进程管理器(推荐)

  • 使用 PM2 启动和管理多个 Node.js 应用,支持负载均衡、自动重启、日志管理。
  • 配置示例(ecosystem.config.js):
    module.exports = {
      apps: [
        {
          name: 'site1',
          script: './app.js',
          instances: 1,
          exec_mode: 'fork',
          max_memory_restart: '300M',
          env: { NODE_ENV: 'production' },
          max_old_space_size: 300,
        },
        // 其他站点...
      ],
    };

    注意:不要使用 cluster mode(多实例),因为 CPU 只有 2 核,且运行 5 个应用,会加剧竞争。

3. 禁用不必要的调试功能

  • 关闭 console.log 在生产环境的输出(或重定向到文件)
  • 移除开发依赖(如 nodemon, debug 工具)

4. 优化代码性能

  • 避免同步阻塞操作(如 fs.readFileSync
  • 使用流处理大文件
  • 缓存频繁计算结果(如使用 lru-cache
  • 减少第三方库依赖,选择轻量级替代方案

二、系统层面优化

1. 启用 Swap 分区(重要!)

  • 2G 内存容易耗尽,添加 1–2GB swap 可防止 OOM 杀死进程。
    sudo fallocate -l 2G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
  • 永久生效:将 /swapfile none swap sw 0 0 添加到 /etc/fstab

2. 调整 Swappiness

  • 降低 swappiness 以减少频繁 swap:
    echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p

3. 监控资源使用

  • 使用 htop, free -h, pm2 monit 实时监控 CPU 和内存。
  • 设置 PM2 报警或集成 Prometheus + Grafana。

4. 使用反向X_X Nginx

  • 用 Nginx 统一管理 5 个站点,实现:

    • 负载分发
    • 静态资源缓存(减少 Node.js 压力)
    • Gzip 压缩
    • HTTPS 终止
  • 示例 Nginx 配置片段:

    server {
      listen 80;
      server_name site1.example.com;
    
      location / {
        proxy_pass http://127.0.0.1:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
      }
    }

三、应用部署策略优化

1. 错峰启动或延迟启动

  • 避免所有 Node.js 应用同时启动导致内存峰值。
  • 使用 PM2 的 delay 启动选项:
    pm2 start ecosystem.config.js --only site1
    sleep 5
    pm2 start ecosystem.config.js --only site2
    # ...

2. 按需运行(可选)

  • 如果某些站点访问量极低,考虑使用 Serverless 或按需唤醒(如通过 cron + HTTP 请求激活)。

3. 日志轮转

  • 使用 PM2 日志轮转或 logrotate 防止日志占满磁盘:
    pm2 install pm2-logrotate
    pm2 set pm2-logrotate:max_size 50M

四、安全与稳定性建议

  • 限制每个站点的并发连接数(通过 Nginx 或应用层限流,如 rate-limiter-flexible
  • 定期重启应用(PM2 支持 autorestartcron 重启)
  • 设置 OOM Killer 优先级(可选):
    echo -500 > /proc/$(pgrep node)/oom_score_adj

五、是否可行?评估建议

项目 建议
单个 Node.js 内存 ≤ 300MB
总内存占用估算 5 × 300MB = 1.5GB + 系统开销 ≈ 接近 2GB
是否需要升级 若流量高或有数据库,建议升级至 4G 内存

⚠️ 若应用中有大量中间件、数据库连接、WebSocket 长连接等,2G 可能不足。


总结:必须做的优化清单

✅ 启用 Swap
✅ 使用 PM2 并限制每个进程内存(--max-old-space-size=300
✅ 使用 Nginx 作为反向X_X并缓存静态资源
✅ 监控内存和 CPU(pm2 monit
✅ 优化代码减少内存泄漏风险
✅ 配置日志轮转和自动重启


如后续流量增长,建议:

  • 拆分服务到多台服务器
  • 使用容器化(Docker + 资源限制)
  • 引入负载均衡

如有具体应用类型(API、SSR、实时通信等),可进一步针对性优化。