Node.js/Express应用本地正常,部署服务器后报Bad Gateway错误求助
解决Express部署后出现Bad Gateway(502)的常见排查步骤
嘿,我之前也踩过这个坑!本地跑的顺风顺水,一部署到正式服务器就跳502,真的挺闹心的。咱们一步步来排查问题:
1. 先确认Express的端口配置是否正确
本地开发时我们习惯用3000、8080这类端口,但部署时要注意:
- 代码里有没有硬写端口?比如
app.listen(3000),但服务器的反向代理(比如Nginx)指向的不是这个端口,或者防火墙没开放该端口。 - 一定要优先使用服务器提供的环境变量端口,比如云平台(Heroku、AWS等)会用
process.env.PORT,正确写法应该是:
这样既能兼容平台自动分配的端口,本地测试也能正常用3000。const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`Server running on port ${port}`); });
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




