AWS上PM2部署React+Express时NGINX报ERR_CONNECTION_REFUSED错误求解
根本原因
React是客户端渲染框架,.env配置项会在编译阶段打包进静态资源,你配置的http://localhost:8017/api/v1/会让用户浏览器访问本地的8017端口,而非你的AWS服务器端口,自然报连接拒绝。替换为公网IP后超时是因为AWS安全组未开放8017端口入站规则,或Express服务仅监听127.0.0.1地址。
排查步骤
- 登录AWS服务器执行
pm2 status,确认CCT_REACT和CCT_API_REST两个进程状态均为online - 服务器本地执行
curl http://127.0.0.1:8017/api/v1/(替换为实际存在的接口路径),确认接口本身可以正常返回数据 - 若公网IP加8017端口访问API超时,先检查AWS实例对应安全组的入站规则,确认已开放8017端口TCP协议的公网访问权限,再检查Express启动逻辑是否绑定了0.0.0.0地址,仅绑定127.0.0.1的话无法接收公网请求
推荐解决方案(无需暴露API端口到公网,更安全)
- 修改NGINX配置,在现有server块内新增API反向代理规则:
location /api/ { proxy_pass http://127.0.0.1:8017/api/; 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; }
- 修改React前端
.env配置,将REACT_APP_DB改为相对路径:
REACT_APP_DB=/api/v1/
- 重新编译React生成静态资源,重启PM2的两个进程,执行
nginx -s reload重载NGINX配置即可
额外注意项
API服务.env中的NODE_ENV=development会被PM2配置里的NODE_ENV=production覆盖,建议统一环境变量配置避免不必要的问题。
内容的提问来源于stack exchange,提问作者Javier Sanchez
相关产品推荐
相关产品推荐

