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

Azure虚拟机上React前端调用Node REST API报连接拒绝

排查与修复方案

核心根因定位

你遇到的连接拒绝问题,本质是踩了硬编码127.0.0.1的经典上云误区:

  • 本地开发时,浏览器、Node服务、前端代码全在你自己的本地电脑上运行,fetch请求里的http://127.0.0.1:5000/listProducts,是浏览器向自身所在的设备的5000端口发请求,刚好和本地启动的Node服务匹配,所以能正常跑通。
  • 迁移到Azure虚拟机后,前端静态文件是通过访问者自己的浏览器加载运行的,这时候浏览器执行fetch请求时,127.0.0.1指向的是访问者自己的本地电脑,根本不是Azure虚拟机的IP。相当于你让访问者打开自己电脑的5000端口去接Azure上的服务,这个端口在用户本地根本不存在,自然会抛出连接拒绝错误。
  • 你配置的全局cors规则在这里完全没生效——因为请求从第一步找目标地址的时候就失败了,根本没触达你的Node服务,跨域规则配置得再完善也起不到作用。

分步修复操作

1. 修正前端请求的硬编码地址

  • 不要在前端代码里硬写127.0.0.1:5000,要么替换成Azure虚拟机的公网IP/绑定域名(比如http://你的Azure公网IP:5000/listProducts),要么更优地使用相对路径/listProducts,配合Apache反向代理转发请求。
  • 注意改完源码后必须重新执行生产构建(npm run build),把新生成的静态文件同步到/var/www/html目录,不要直接改线上部署的静态文件或者忘了重新构建就刷新页面。

2. 检查Node服务的网络监听配置

很多人写Node服务时默认监听127.0.0.1,这种配置下服务只接受虚拟机内部发起的本地请求,外部流量根本无法触达:

  • 打开server.js,找到app.listen()的配置行,确保监听地址是0.0.0.0:5000,而不是127.0.0.1:5000。前者代表服务接受所有网卡上收到的5000端口请求,后者仅限本机回环地址的请求。
  • 修改完在虚拟机内部执行curl http://127.0.0.1:5000/listProducts,确认能正常返回MySQL查询的商品列表数据,先排除Node服务启动异常、数据库连接报错的内部问题。

3. 放开全链路的5000端口访问限制

就算Node服务配置正确,两道网络防火墙没放开端口的话,外部请求还是会被直接拦截,表现为连接拒绝:

  • 打开Azure虚拟机对应的网络安全组(NSG),添加入站规则:允许TCP协议5000端口的来源访问,不要只放通80、443的Web端口。
  • 检查虚拟机内部的系统防火墙配置:
    • Ubuntu/Debian 系统执行ufw allow 5000/tcp放通端口
    • RHEL/CentOS 系统执行firewall-cmd --add-port=5000/tcp --permanent && firewall-cmd --reload完成配置

4. 生产环境优化(推荐操作)

当前架构单独把5000端口暴露到公网的方式既不安全,也容易遇到端口映射问题,可以直接用现有Apache的反向代理能力简化链路:

  • 在Apache的站点配置中添加转发规则,把所有发往/api路径的请求,直接转发到虚拟机内部本地的Node服务5000端口:
    ProxyRequests Off
    ProxyPass /api http://127.0.0.1:5000/
    ProxyPassReverse /api http://127.0.0.1:5000/
    
  • 调整前端fetch请求为相对路径/api/listProducts,这种模式下既不需要把5000端口开放到公网,也不需要硬编码服务器公网IP,同时完全不会触发跨域问题。
    补充说明:你现在把MySQL的连接地址配置为127.0.0.1是完全合理的——Node服务和MySQL在同一台虚拟机内部运行,走本地回环地址访问数据库是性能最优、安全性最高的配置,这块不需要做任何调整。

内容的提问来源于stack exchange,提问作者Mr. Engineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 14:54:04