Azure App Service Linux上PM2运行Node.js/Express仅8080端口可用问题
核心原因: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

