You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure App Service Linux上PM2运行Node.js/Express仅8080端口可用问题

Azure App Service Linux上PM2用8081端口出现504超时的问题排查

核心原因:Azure平台的端口强制映射规则

Azure App Service Linux环境里,平台只会把外部请求转发到容器内部的8080端口(或者平台自动注入的PORT环境变量指定的端口)。不管你在PM2配置或代码里硬设其他端口(比如8081),平台都不会把外部流量导过去,外部请求根本到不了你的应用,自然就会触发504网关超时。

解决步骤

  • 确认PORT变量的优先级
    Azure会自动注入一个PORT环境变量,这个值是平台分配的(通常是8080),会直接覆盖你手动设置的PORT值。你可以在App Service的「配置」→「环境变量」里查看这个变量,也可以在应用里打印process.env.PORT,看看实际运行时用的是哪个端口。

  • 修改PM2配置适配平台规则
    别在PM2的环境配置里硬编码端口,直接让应用读取平台的PORT变量就行。修改后的PM2配置示例:

    module.exports = {
      apps: [
        {
          name: "myapi",
          script: "./src/index.js",
          env: {
            NODE_ENV: "development"
          },
          env_test: {
            NODE_ENV: "test"
          },
          env_production: {
            NODE_ENV: "production"
          }
        }
      ]
    };
    

    同时在Express代码里,确保监听平台指定的端口:

    const port = process.env.PORT || 8080;
    app.listen(port, () => {
      console.log(`Server running on port ${port}`);
    });
    
  • 环境区分不要靠端口
    如果需要区分测试/生产环境,别用端口来区分,改用自定义环境变量。比如在PM2配置里加:

    env_test: {
      NODE_ENV: "test",
      APP_MODE: "test"
    }
    

    然后在代码里根据APP_MODE来处理不同逻辑,端口依然用平台的PORT变量。

  • 验证启动命令
    确认pm2-runtime start ecosystem.config.js --env test确实加载了test环境配置,但即使加载了,端口还是会被平台的PORT覆盖,所以重点还是让应用监听正确的端口。

总结

Azure App Service Linux不允许自定义对外暴露的端口,所有外部请求都只能到平台指定的8080端口(或PORT变量对应的端口)。只要让应用监听这个端口,就能解决504超时问题。

内容的提问来源于stack exchange,提问作者user3616544

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:15:57