在华为云服务器上安装PM2
首先确保华为云弹性云服务器已安装Node.js环境,推荐使用nvm管理版本:
# 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
# 安装Node.js 20 LTS
nvm install 20
nvm use 20
# 全局安装PM2
npm install pm2@latest -g
# 验证安装
pm2 -v
安装完成后,建议配置npm国内镜像源加速后续依赖安装:
npm config set registry https://registry.npmmirror.com
编写生态系统配置文件
不要用命令行参数启动生产应用,使用ecosystem.config.js配置文件可以实现可复现、可版本控制的部署。在项目根目录创建配置文件:
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-node-app', // 应用名称,便于PM2管理
script: 'node_modules/.bin/next', // 启动脚本路径
args: 'start', // 启动参数
instances: 'max', // 启动实例数,max表示使用所有CPU核心
exec_mode: 'cluster', // 集群模式,实现负载均衡
watch: false, // 生产环境务必关闭文件监听
max_memory_restart: '500M', // 内存超过500M自动重启,防止内存泄漏
node_args: '--max-old-space-size=512', // Node.js内存限制
// 环境变量配置
env: {
NODE_ENV: 'production',
PORT: 3000
},
// 日志配置
log_date_format: 'YYYY-MM-DD HH:mm:ss',
error_file: '/var/log/pm2/my-node-app-error.log',
out_file: '/var/log/pm2/my-node-app-out.log',
merge_logs: true, // 合并集群实例日志
// 重启策略
autorestart: true, // 崩溃后自动重启
restart_delay: 3000, // 重启间隔3秒,避免频繁重启
max_restarts: 10, // 最大重启次数
min_uptime: '10s', // 至少运行10秒才算启动成功
// 优雅关闭
kill_timeout: 5000, // 给应用5秒完成正在处理的请求
listen_timeout: 10000 // 监听超时时间
}]
};
配置要点说明:
instances: 'max':自动检测CPU核心数并启动对应数量的worker进程exec_mode: 'cluster':集群模式下PM2在worker间做负载均衡,提升并发处理能力watch: false:生产环境绝对不能开启文件监听,否则会导致无限重启循环max_memory_restart:内存泄漏防护,超标自动重启避免服务雪崩
启动应用并配置开机自启
使用生态系统配置文件启动应用:
# 通过配置文件启动
pm2 start ecosystem.config.js
# 查看进程状态
pm2 status
# 查看实时日志
pm2 logs my-node-app
配置开机自启(关键步骤):
# 生成systemd启动脚本
pm2 startup
# 执行上面命令输出的那条sudo命令(类似如下)
sudo env PATH=$PATH:/root/.nvm/versions/node/v20.x.x/bin pm2 startup systemd -u root --hp /root
# 保存当前进程列表
pm2 save
pm2 startup会输出一条需要手动执行的命令,必须复制并执行才能真正设置开机自启。服务器重启后,PM2会自动恢复之前保存的所有应用进程。
PM2日常运维常用命令
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看所有应用状态 | pm2 status |
显示进程运行状态、CPU和内存占用 |
| 零停机重启 | pm2 reload my-node-app |
集群模式下逐个重启worker,全程无中断 |
| 强制重启 | pm2 restart my-node-app |
会有短暂中断,用于紧急情况 |
| 停止应用 | pm2 stop my-node-app |
停止进程但保留记录 |
| 删除应用 | pm2 delete my-node-app |
从PM2列表中完全移除 |
| 查看详细信息 | pm2 show my-node-app |
显示内存、CPU、重启次数等详情 |
| 监控面板 | pm2 monit |
实时CPU和内存可视化监控 |
| 清空日志 | pm2 flush my-node-app |
清空该应用所有日志 |
| 更新环境变量 | pm2 restart ecosystem.config.js --update-env |
重新读取环境变量后重启 |
pm2 reload与pm2 restart的区别:
reload在集群模式下逐个重启worker,旧worker处理完当前请求后退出,新worker就绪后接管流量,实现零停机。restart则同时终止所有worker再启动,会有短暂服务中断。生产环境更新代码时务必使用reload。
日志管理与轮转配置
防止日志文件无限增长占用磁盘空间,安装PM2日志轮转插件:
# 安装日志轮转插件
pm2 install pm2-logrotate
# 配置日志大小限制(超过10M自动轮转)
pm2 set pm2-logrotate:max_size 10M
# 配置保留天数
pm2 set pm2-logrotate:retain 7
# 配置轮转时间(每天凌晨轮转)
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD
在华为云服务器上,建议将日志目录设置在独立的数据盘上,避免日志增长导致系统盘空间不足。
内存泄漏防护与监控
Node.js应用的内存泄漏是生产环境的常见问题,PM2提供了有效的防护机制:
1. 配置内存阈值自动重启
在ecosystem.config.js中设置max_memory_restart,当进程内存超过阈值时PM2会自动重启该进程,避免内存持续增长导致服务器崩溃。
2. 启用V8内存限制
通过node_args: '--max-old-space-size=512'限制Node.js堆内存上限,与PM2的内存重启机制配合使用。
3. 实时监控内存使用
# 打开PM2监控面板,实时查看CPU和内存
pm2 monit
# 查看特定应用的详细信息
pm2 show my-node-app
4. 定期检查进程重启次数
# 查看重启次数,异常频繁重启说明存在问题
pm2 show my-node-app | grep "restart time"
集群模式性能优化
华为云弹性云服务器提供多核CPU配置,通过PM2集群模式可以充分利用所有核心:
选择合适的实例数量:
- 1-2核服务器:建议设置
instances: 2,预留部分资源给系统和Nginx - 4核及以上服务器:可以使用
instances: 'max',充分利用所有核心 - 有状态应用(如WebSocket):建议使用fork模式单实例运行,配合Redis实现状态共享
集群模式下的注意事项:
- Next.js等SSR框架内部有自己的多线程处理,建议使用
instances: 1的fork模式 - NestJS等纯API服务适合cluster模式,可以显著提升并发处理能力
- 构建阶段内存消耗较大,建议在构建时临时停止PM2管理的进程
配合Nginx实现生产级部署
PM2应与Nginx反向代理配合使用,形成完整的生产部署架构:
upstream node_backend {
server 127.0.0.1:3000 max_fails=2 fail_timeout=30s;
keepalive 64; # 保持长连接,减少TCP握手开销
}
server {
listen 80;
server_name 你的域名;
# 静态资源由Nginx直接处理
location /_next/static/ {
alias /var/www/app/.next/static/;
expires 365d;
add_header Cache-Control "public, immutable";
}
# 动态请求转发给PM2管理的Node.js进程
location / {
proxy_pass http://node_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
这种架构让Nginx处理SSL终止、静态文件服务和请求缓冲,PM2专注于Node.js进程管理,各司其职提升整体稳定性。
常见问题与解决方案
Q:服务器重启后应用没有自动恢复怎么办?
A:检查是否执行了pm2 startup输出的sudo命令,以及是否执行了pm2 save。可以通过pm2 resurrect手动恢复之前保存的进程列表。
Q:PM2应用频繁重启是什么原因?
A:查看错误日志pm2 logs 应用名 --err,常见原因包括内存泄漏、端口占用、依赖缺失或配置错误。可以通过max_restarts限制最大重启次数防止无限重启。
Q:如何在不中断服务的情况下更新代码?
A:使用pm2 reload而非pm2 restart。reload在集群模式下逐个重启worker,确保任何时刻都有worker在处理请求。更新代码后执行npm install && pm2 reload ecosystem.config.js即可。
Q:华为云服务器1核2G配置够用吗?
A:个人项目和轻量API服务基本够用,但SSR应用对内存消耗较大,建议选择2核4G配置。同时要合理设置max_memory_restart参数,避免内存耗尽导致服务不可用。