You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Node.js/Express应用本地正常,部署服务器后报Bad Gateway错误求助

解决Express部署后出现Bad Gateway(502)的常见排查步骤

嘿,我之前也踩过这个坑!本地跑的顺风顺水,一部署到正式服务器就跳502,真的挺闹心的。咱们一步步来排查问题:

1. 先确认Express的端口配置是否正确

本地开发时我们习惯用3000、8080这类端口,但部署时要注意:

  • 代码里有没有硬写端口?比如app.listen(3000),但服务器的反向代理(比如Nginx)指向的不是这个端口,或者防火墙没开放该端口。
  • 一定要优先使用服务器提供的环境变量端口,比如云平台(Heroku、AWS等)会用process.env.PORT,正确写法应该是:
    const port = process.env.PORT || 3000;
    app.listen(port, () => {
      console.log(`Server running on port ${port}`);
    });
    
    这样既能兼容平台自动分配的端口,本地测试也能正常用3000。

2. 检查反向代理(如Nginx)的配置

大部分正式服务器都会用Nginx做反向代理,502很多时候是代理和Express没对接上:

  • 打开Nginx配置文件(通常在/etc/nginx/sites-available/下),确认proxy_pass指向的地址和Express监听的完全一致,比如:
    location / {
      proxy_pass http://localhost:3000; # 这里的端口要和Express的监听端口匹配
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
    
  • 配置改完后记得重启Nginx:sudo systemctl restart nginx
  • 查看Nginx错误日志找线索:cat /var/log/nginx/error.log,如果日志里出现connect() failed (111: Connection refused),说明Express根本没启动或者端口不对。

3. 确认Express应用在服务器上能正常启动

登录服务器,手动启动应用看看有没有报错:

  • 先确保依赖都装全了:在项目目录下运行npm install,如果是生产环境,记得用npm install --production(避免装devDependencies里的包)
  • 直接运行node app.js,看控制台输出有没有错误提示:比如数据库连接失败、某个依赖缺失、环境变量未配置(比如本地有.env但服务器没设置)
  • 如果应用启动后立刻崩溃,检查有没有未捕获的异常,记得在代码里加上错误处理中间件:
    app.use((err, req, res, next) => {
      console.error(err.stack);
      res.status(500).send('Something broke!');
    });
    

4. 权限与进程管理问题

  • 如果Express要监听80、443这类低于1024的端口,普通用户没有权限启动,会导致启动失败。建议用Nginx反向代理到高位端口(比如3000),不要用sudo启动Express(不安全)。
  • 如果用了pm2这类进程管理工具,检查应用状态:pm2 status,如果显示errored,查看日志:pm2 logs,就能知道崩溃原因。

5. 服务器防火墙设置

确认服务器防火墙开放了Express监听的端口,比如用ufw的话:

sudo ufw allow 3000
sudo ufw reload

先从这几个方向查,基本能解决大部分502的问题。如果还是不行,把服务器上的应用日志和Nginx错误日志贴出来,更容易定位问题!

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

火山引擎 最新活动