Ubuntu服务器Angular调用NodeJS后端API遇ERR_CONNECTION_REFUSED
Ubuntu服务器上Angular+Nginx访问本地NodeJS API出现ERR_CONNECTION_REFUSED的解决思路
问题描述
在Ubuntu服务器上通过NGINX部署Angular站点后,访问同一服务器上运行在localhost:3000的NodeJS后端API时,持续出现ERR_CONNECTION_REFUSED错误。本地环境中Angular与API协作正常,已尝试配置代理文件、启用CORS等操作但未解决。
排查与解决方案
1. 修正NodeJS后端的监听地址
后端仅监听localhost:3000的话,只能接收服务器本地发起的请求,外部或Nginx的请求无法到达。修改后端代码,让其监听所有网卡:
// 原监听代码示例 // app.listen(3000, 'localhost', () => { ... }); // 修改为监听0.0.0.0 app.listen(3000, '0.0.0.0', () => { console.log('API服务运行在0.0.0.0:3000'); });
2. 配置Nginx反向代理(替代Angular开发代理)
注意:angular.json中的proxyConfig是**开发环境(ng serve)**的配置,部署到Nginx后完全无效。需要在Nginx站点配置中添加反向代理规则:
打开Nginx配置文件(通常路径:/etc/nginx/sites-available/你的站点.conf),在server块内添加:
location /api/v1/ { proxy_pass http://localhost:3000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
保存后重启Nginx:
sudo systemctl restart nginx
3. 调整前端API请求路径
前端直接调用https://myIPAdress/api/v1/...会绕过Nginx代理,直接请求3000端口(大概率被防火墙拦截)。改为相对路径即可:
registerUser(username: string, password: string, email: string){ // 去掉域名,使用相对路径 let url="/api/v1/users/register"; return this.http.post(url, { "username": username, "email": email, "password": password }) }
4. 检查服务器防火墙(可选)
如果非要直接开放3000端口(不推荐,存在安全风险),可以执行:
# Ubuntu用ufw防火墙的话,永久开放3000端口 sudo ufw allow 3000/tcp # 重启防火墙生效 sudo ufw reload
更安全的做法是通过Nginx反向代理,无需对外暴露3000端口。
5. 验证后端服务状态
确保NodeJS服务正在运行且监听正确端口:
# 检查端口监听情况 sudo ss -tulpn | grep 3000
如果输出显示0.0.0.0:3000则监听正常;若只有127.0.0.1:3000,说明还是监听地址的问题,回到步骤1修改。
内容的提问来源于stack exchange,提问作者MansNotHot
相关产品推荐
相关产品推荐

