在一台 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 支持
autorestart和cron重启) - 设置 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、实时通信等),可进一步针对性优化。
PHPWP博客