PM2专管Node.js进程生命周期与稳定性,确保其监听127.0.0.1:3000等本地端口并由Apache反向代理;需用ecosystem.config.js配置集群模式、环境变量及内存限制,并配合pm2 startup实现开机自启。

Apache 本身不运行 Node.js,它只负责反向代理请求;真正执行业务逻辑的是 Node.js 进程。所以 Apache + Node.js 的部署模式中,PM2 的作用非常明确:**专管 Node.js 应用进程的生命周期、稳定性与资源利用,和 Apache 各司其职**。
确保 Node.js 服务独立、可被代理
PM2 管理的前提是 Node.js 服务能稳定监听一个本地端口(如 3000 或 9000),且不绑定 0.0.0.0 以外的地址(避免暴露在公网)。常见配置要点:
- 代码中监听
127.0.0.1:3000(或省略 host,默认即本地回环),禁止监听0.0.0.0:3000—— 防止绕过 Apache 直接访问 - 确认 Node.js 服务启动后,能在服务器本机用
curl http://127.0.0.1:3000正常返回响应 - 端口不能被 Apache、MySQL 或其他服务占用,可用
sudo ss -tuln | grep :3000检查
用 PM2 启动并守护 Node.js 服务
不要用 node app.js 直接启动,而是交由 PM2 托管。推荐使用配置文件方式,便于复用和维护:
- 新建
ecosystem.config.js(比 JSON 更灵活,支持环境变量和动态逻辑) - 关键字段示例:
module.exports = { apps: [{ name: 'my-api', script: './app.js', instances: 'max', // 自动匹配 CPU 核心数,启用集群模式 exec_mode: 'cluster', watch: false, // 生产环境禁用文件监听,避免误重启 ignore_watch: ['node_modules', 'logs'], env_production: { NODE_ENV: 'production', PORT: 3000 } }] }; - 执行启动命令:
pm2 start ecosystem.config.js --env production - 验证:
pm2 list显示online状态,pm2 monit查看实时资源占用
配合 Apache 反向代理转发请求
Apache 不接管 Node.js 进程,只做「流量入口」。需启用 proxy 和 proxy_http 模块,并配置虚拟主机:
- 启用模块:
sudo a2enmod proxy proxy_http - 在站点配置中(如
/etc/apache2/sites-available/myapp.conf)添加:<VirtualHost *:80> ServerName api.example.com ProxyPreserveHost On ProxyPass / http://127.0.0.1:3000/ ProxyPassReverse / http://127.0.0.1:3000/ </VirtualHost> - 启用并重载:
sudo a2ensite myapp.conf && sudo systemctl reload apache2
补充关键运维动作
仅启动还不够,生产环境还需保障长期可靠:
-
开机自启:运行
pm2 startup生成系统级启动脚本,再执行pm2 save持久化当前进程列表 -
日志分离:在配置中指定
error_file和out_file,避免日志混杂;用pm2 flush清空缓冲,pm2 logs my-api实时追踪 -
异常自动恢复:默认已开启崩溃重启;如需内存超限重启,加配置
max_memory_restart: '512M' -
避免端口冲突:若 Apache 已占 80/443,Node.js 必须用其他端口(如 3000、8000、9000),且 Apache 的
ProxyPass必须与之严格一致


















