Amazon EC2中Node.js应用监听80端口无法访问排查求助
既然你已经检查过AWS安全组和官方文档了,我来给你梳理几个最容易踩坑的排查点,帮你定位问题:
常见排查方向
1. 确认Node.js应用监听的是0.0.0.0而非localhost
很多开发者会下意识把应用监听地址设为localhost或127.0.0.1,但这个地址只允许实例内部访问,公网请求根本传不进来。你可以登录EC2实例,用以下命令检查监听端口的绑定地址:
netstat -tulpn | grep :80 # 或者用更现代的ss命令 ss -tulpn | grep :80
如果输出里的地址是127.0.0.1:80,赶紧修改代码里的监听配置,把地址改成0.0.0.0,比如:
app.listen(80, '0.0.0.0', () => { console.log('Server running on port 80'); });
改完重启应用再测试访问。
2. 检查EC2实例本地防火墙规则
AWS安全组是外部防护,但实例本身可能还有本地防火墙(比如Ubuntu的ufw、CentOS的iptables)限制了80端口:
- Ubuntu/Debian系统:执行
sudo ufw status查看规则,如果没有允许80端口的条目,运行sudo ufw allow 80/tcp,然后重启ufw生效。 - CentOS/RHEL系统:执行
sudo iptables -L -n检查规则,若没有ACCEPT tcp dpt:80的条目,添加规则:sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT,再用sudo service iptables save保存规则(不同版本命令可能略有差异)。
3. 验证实例状态与公网IP正确性
先到AWS控制台确认两件事:
- 实例状态是running,没有被意外停止或终止;
- 你访问的公网IP和实例控制台显示的完全一致,且实例已经分配了公网IP(VPC子网中的实例需要开启自动分配公网IP,或者绑定了弹性IP)。
4. 检查Node.js应用是否正常运行
登录实例后,用ps aux | grep node查看Node进程是否存在。如果进程消失,说明应用可能崩溃了,得排查启动日志:
- 如果是直接用命令启动的,查看终端输出的报错信息;
- 如果是用systemd托管的服务,执行
journalctl -u your-app-service-name查看详细日志,常见问题比如端口被占用、依赖包缺失、代码语法错误等。
5. 先测试实例内部访问情况
在EC2实例内部,用curl http://localhost或curl http://<实例私网IP>测试能否正常获取响应:
- 如果内部访问失败,问题肯定出在应用本身或本地配置,和安全组无关;
- 如果内部能正常访问,外部不行,再回到网络层面(路由表、NAT网关/IGW)排查。
6. VPC环境下检查路由表配置
如果你的实例在VPC子网中,必须确保子网的路由表包含指向互联网网关(IGW)的条目。到VPC控制台找到对应子网的路由表,检查是否有0.0.0.0/0指向IGW的规则——没有这条规则的话,实例无法和公网通信。
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

