AWS Ubuntu EC2上Django应用无法连接问题求助
解决EC2上Django runserver外部访问超时的问题
哥们,我之前在EC2上部署Django时也踩过一模一样的坑!咱们一步步来排查解决:
1. 最核心的问题:你用了私有IP对外访问
EC2的私有IP(比如你用的172.31.27.208)是AWS VPC内部的专属IP,外部互联网根本无法直接访问——只有同VPC内的其他实例、或者通过VPN/Direct Connect连接到AWS的设备才能访问它。
你需要做两件事:
- 找到EC2实例的公网IP/弹性IP:在EC2控制台的实例详情页面就能看到(如果没分配弹性IP,重启实例后公网IP可能会变,建议分配一个固定的弹性IP)。
- 修改runserver的绑定地址,让Django监听所有网卡:
这样服务会监听实例的所有IP(包括公网IP),之后用python manage.py runserver 0.0.0.0:8000公网IP:8000在浏览器访问试试。
2. 检查Ubuntu本地防火墙(ufw)
AWS安全组是第一道防线,但Ubuntu默认自带的ufw防火墙可能会偷偷拦截端口。执行以下命令检查状态:
sudo ufw status
如果输出显示active,说明防火墙在运行,需要手动放行8000端口:
sudo ufw allow 8000/tcp sudo ufw reload
3. 再次确认端口监听范围
你之前用netstat -lan看到的是tcp 0 0 172.31.27.208:8000 0.0.0.0:* LISTEN,这说明服务只绑定了私有IP——外部请求打到公网IP时,实例的网卡根本不会响应这个端口的请求。改成绑定0.0.0.0:8000后,再用netstat -lan检查,应该会看到tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN,这才是正确的监听状态。
4. 测试网络连通性
如果上面的步骤都做完还是不行,在本地终端用工具测试端口是否能通:
# 用telnet测试 telnet 你的公网IP 8000 # 或者用nc(netcat)测试 nc -zv 你的公网IP 8000
如果显示连接成功,那可能是浏览器缓存、本地代理或者网络运营商的问题;如果还是超时,再回去检查AWS安全组的规则是否正确(比如入站规则的源是不是0.0.0.0/0,协议是TCP,端口确实是8000)。
内容的提问来源于stack exchange,提问作者Mykhail Kosiuk
相关产品推荐
相关产品推荐

