Node应用在Azure App Service无法运行:容器无响应、pm2持续重启
Node.js应用部署Azure App Service:容器预热失败+pm2集群模式频繁重启(SIGINT 255)
应用环境
- 代码:TypeScript编译为JavaScript,本地构建后打包Zip部署
- 端口配置:监听
PORT环境变量 - 启动方式:pm2集群模式,启动命令
pm2 start ecosystem.config.js --no-daemon
异常现象
- Azure容器无法响应预热请求,日志显示持续等待响应
- 应用频繁重启,pm2日志记录应用启动后因SIGINT信号以255码退出
已尝试无效方案
- 设置
WEBSITES_CONTAINER_START_TIME_LIMIT为1800 - 单独/同时配置
WEBSITES_PORT和PORT为8080 - 本地验证应用运行正常,反复检查pm2配置
- 查阅Azure官方文档及社区帖子尝试其他方法
核心排查与修复步骤
1. 修正pm2集群模式的就绪检测逻辑
Azure容器的预热/健康检查依赖应用明确的就绪信号,pm2集群模式下需配置等待就绪机制,避免Azure提前发送请求:
- 修改
ecosystem.config.js,添加就绪检测相关配置:
module.exports = { apps: [{ name: 'your-app', script: './dist/index.js', exec_mode: 'cluster', instances: 'max', // 建议不超过Azure实例CPU核心数 env: { NODE_ENV: 'production', PORT: process.env.PORT || 8080 }, wait_ready: true, // 等待应用发送ready信号 listen_timeout: 30000, // 延长就绪等待时长至30秒 kill_timeout: 5000 // 给进程足够的终止缓冲时间 }] };
- 在应用启动代码中发送就绪信号:
const server = app.listen(process.env.PORT, () => { console.log(`Server running on port ${process.env.PORT}`); // 向pm2发送就绪通知 if (process.send) { process.send('ready'); } });
2. 调整Azure健康检查配置
Azure默认健康检查访问根路径/,若该路径未返回200 OK,会判定应用不健康并触发重启:
- 在Azure门户进入应用服务 > 配置 > 健康检查,设置健康检查路径为应用实际可用的接口(如
/health),确保该接口返回200状态码。 - 若暂无专用健康接口,可临时在根路径添加返回200的逻辑,或延长健康检查超时时间。
3. 验证pm2启动命令的正确性
确保pm2启动命令适配Azure容器环境:
- 用项目依赖的pm2而非全局安装版本,修改启动命令为:
npx pm2 start ecosystem.config.js --no-daemon
- 确认
ecosystem.config.js在部署包的根目录,若路径不同需在命令中指定完整路径(如./src/ecosystem.config.js)。
4. 临时禁用预热功能验证
若预热是触发重启的核心因素,可先关闭预热排查:
- 在Azure门户应用服务 > 配置 > 常规设置,将预热实例设为关闭。
- 部署后观察应用是否稳定运行,若稳定则聚焦调整预热阶段的端口/就绪检测逻辑。
5. 排查端口与权限问题
- 确保
PORT和WEBSITES_PORT均设置为1024以上的非特权端口(如8080),避免权限不足导致端口绑定失败。 - pm2集群模式下,无需手动设置端口偏移,应用仅需监听
process.env.PORT,pm2会自动处理子进程的端口转发。
6. 提取详细日志定位问题
- 通过Azure门户的SSH终端登录容器,执行
pm2 logs查看实时应用日志。 - 查看
/home/LogFiles目录下的pm2-*.log文件,获取更详细的启动错误信息。 - 在应用代码中添加启动阶段的日志(如端口绑定时间、服务就绪时间),便于定位启动卡点。
内容的提问来源于stack exchange,提问作者wooters
相关产品推荐
相关产品推荐

