AWS EC2 Ubuntu实例仅监听22端口,Node应用部署受阻
解决Node.js应用部署到AWS EC2 Ubuntu实例后仅监听SSH端口22的问题
我明白你现在的困惑——明明AWS安全组已经开了80端口,执行netstat -ntlp | grep LISTEN却只看到22端口在监听,但又说能访问Node服务器,这确实有点矛盾。咱们一步步拆解排查:
1. 先检查Node应用的监听配置
这是最常见的问题:很多Node默认会绑定127.0.0.1(本地回环地址),这时候进程虽然在运行,但只有实例内部能访问,外部看不到这个监听端口。
- 打开你的Node代码,确认服务器监听的地址是
0.0.0.0(允许所有IP访问),而不是127.0.0.1或者localhost。比如:// 正确写法:允许外部访问 app.listen(80, '0.0.0.0', () => { console.log('Server running on public port 80'); }); // 错误写法:仅本地能访问 app.listen(80, '127.0.0.1', () => { ... }); - 另外,确认你的Node应用实际用的是80端口吗?如果用的是3000、8080这类端口,那
netstat里自然不会显示80的监听记录,同时要确保安全组也开放了对应端口。
2. 验证Ubuntu本地防火墙状态
你提到暂不认为是防火墙问题,但还是建议快速确认下Ubuntu自带的ufw状态:
- 执行命令查看当前防火墙规则:
sudo ufw status - 如果
ufw是开启状态,确保已经允许目标端口的TCP流量:sudo ufw allow 80/tcp # 替换成你的Node应用端口 sudo ufw reload
3. 直接定位Node进程的监听信息
用更精准的命令查看Node进程到底在监听什么IP和端口:
- 用
netstat过滤Node进程:netstat -ntlp | grep node - 或者用更现代的
ss命令,输出更清晰:ss -tulpn | grep node
如果结果显示127.0.0.1:xxxx,那就是地址绑定的问题,改成0.0.0.0即可;如果端口不是80,那要同步更新安全组的端口规则。
4. 关于“能访问Node服务器但异常”的补充说明
如果你是在EC2实例内部通过curl 127.0.0.1或者本地IP访问到的,那其实外部是无法访问的——这只是本地回环的访问,不算真正的外部访问。建议从你的本地电脑(比如家里的机器)用EC2的公网IP访问试试,看是否能正常打开。
如果外部确实能访问,但netstat看不到80端口监听,那大概率是用了反向代理(比如Nginx),这时候是Nginx在监听80端口,然后把请求转发到Node应用的端口,这种情况下netstat里会显示Nginx的监听进程。
按照上面的步骤排查,应该就能找到问题所在并解决啦!
内容的提问来源于stack exchange,提问作者Programmer wannabe
相关产品推荐
相关产品推荐

