如何向EC2实例发送POST请求?解决请求超时与连接拒绝问题
EC2上Node.js API请求超时/连接拒绝问题排查
问题背景
在Ubuntu系统的EC2实例部署了Node.js编写的简易API,已安装Node.js。API功能是接收POSTMAN的JSON POST请求,提取数据存入Mongo Atlas。但请求时遇到以下问题:
- 用EC2私有IP请求:会话超时
- 用公网域名格式
https://ec2-xxxx-xxxx-xxxx-xxxx.us-east-2.compute.amazonaws.com:3001/products请求:同样超时 - 用错误格式
xxxx.xxxx.xxxx.xxxx/3001/products请求:connect ECONNREFUSED
服务器代码
const http = require('http'); const app=require('./app.js'); const port=process.env.PORT || 3001; const server=http.createServer(app); server.listen(port);
排查与解决步骤
1. 修正URL格式
错误格式xxxx.xxxx.xxxx.xxxx/3001/products缺少端口号前缀:,且你的API基于http模块创建,并非HTTPS,正确请求格式应为:
- 公网IP请求:
http://<公网IP>:3001/products - 公网域名请求:
http://ec2-xxxx-xxxx-xxxx-xxxx.us-east-2.compute.amazonaws.com:3001/products
2. 安全组入站规则验证
需确保EC2安全组已开放3001端口的TCP流量:
- 入站规则添加:类型选「自定义TCP」,端口范围填
3001,源设置为0.0.0.0/0(测试阶段可临时开放全部IP,后续再缩窄范围) - 确认规则已绑定到目标EC2实例
3. 验证EC2内部端口监听状态
在EC2终端执行命令,检查Node进程是否正常监听3001端口:
# 查看端口占用 sudo lsof -i :3001 # 或用netstat sudo netstat -tulpn | grep 3001
如果无输出,说明Node服务未启动或启动失败,检查app.js是否存在错误,重启服务:
node server.js
4. 本地连通性测试
在EC2实例内部用curl测试API是否正常响应:
curl -X POST http://localhost:3001/products -H "Content-Type: application/json" -d '{"key":"value"}'
如果本地请求正常,说明问题出在外部网络层面;如果本地也失败,优先排查API代码逻辑错误。
5. 私有IP无法访问的原因
EC2私有IP仅能在VPC内部网络访问,外部设备(如本地电脑)无法通过私有IP直接连接实例,必须使用公网IP或公网域名。
内容的提问来源于stack exchange,提问作者Driver
相关产品推荐
相关产品推荐

