使用GitHub Actions部署Node.js到Azure遇资源未找到及端口探测失败问题
问题描述
通过GitHub Actions将Node.js应用部署至Azure平台,部署流程显示成功,但访问应用URL时出现“application error”提示;点击“diagnostic resources.”链接后显示“Resource Not Found”错误;日志流中出现以下关键错误:
Container mongez-api__04d6 didn't respond to HTTP pings on port: 8080, failing site start. See container logs for debugging
现有配置
package.json scripts:
"scripts": { "build": "rimraf build && node esbuild.config.mjs", "start": "node build/index.cjs" },
GitHub Actions工作流:
name: Build and deploy Node.js app to Azure Web App - mongez-api on: push: branches: - main workflow_dispatch: jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Node.js version uses: actions/setup-node@v3 with: node-version: 20 - name: npm install, build, and test run: | npm install npm run build --if-present npm run test --if-present - name: Zip artifact for deployment run: zip release.zip ./* -r - name: Upload artifact for deployment job uses: actions/upload-artifact@v4 with: name: node-app path: release.zip deploy: runs-on: ubuntu-latest needs: build environment: name: 'dev' url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} steps: - name: Download artifact from build job uses: actions/download-artifact@v4 with: name: node-app - name: Unzip artifact for deployment run: unzip release.zip - name: 'Deploy to Azure Web App' id: deploy-to-webapp uses: azure/webapps-deploy@v3 with: app-name: 'mongez-api' slot-name: 'dev' package: . publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_2AC3E6F38101424C8DEE01C88E4C81E8 }}
核心问题分析
Azure Web App会向容器的指定端口发送HTTP探测请求,若应用未在该端口监听、启动延迟超过阈值,或部署包存在问题,都会触发探测失败导致站点无法启动。默认探测端口为8080,需从端口绑定、部署完整性、启动配置三方面排查。
修复步骤
1. 确保应用监听正确端口
检查Node.js应用代码,确认服务器实例(如Express、Koa)监听的端口为process.env.PORT || 8080——Azure会自动注入PORT环境变量,硬编码其他端口会导致探测失败。
示例修正(Express为例):
const port = process.env.PORT || 8080; app.listen(port, () => { console.log(`Server running on port ${port}`); });
2. 优化部署包与依赖安装
当前打包命令会将node_modules一起压缩,跨环境的依赖可能引发兼容性问题。推荐两种优化方式:
方式一:部署阶段安装生产依赖
修改GitHub Actions的deploy步骤,在解压后重新安装生产依赖:
- name: Unzip artifact for deployment run: unzip release.zip - name: Install production dependencies run: npm ci --only=production - name: 'Deploy to Azure Web App' id: deploy-to-webapp uses: azure/webapps-deploy@v3 with: app-name: 'mongez-api' slot-name: 'dev' package: . publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_2AC3E6F38101424C8DEE01C88E4C81E8 }}
方式二:只打包必要文件
修改build阶段的zip命令,排除node_modules,仅打包核心文件:
zip release.zip package.json package-lock.json build/ -r
3. 手动配置Azure启动命令(可选)
若Azure未自动识别start脚本,可在Azure门户手动设置:
进入Web App → 配置 → 常规设置,将启动命令设置为:
npm start
4. 调整启动探测超时时间
若应用启动较慢,可延长探测超时:
进入Web App → 配置 → 容器设置,修改启动探测的超时时间(如从20秒调整为60秒),给应用足够的启动缓冲。
5. 查看容器日志定位细节
通过Azure门户的Web App → 日志 → 日志流,或运行以下Azure CLI命令查看容器启动日志,排查代码错误、依赖缺失等问题:
az webapp log tail --name mongez-api --resource-group <你的资源组名称>
内容的提问来源于stack exchange,提问作者Ahmed Abdelrahman

