You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在同一AWS EC2 Linux实例内调用Django REST API求助

嘿,我之前也碰到过一模一样的EC2内部调用DRF API的坑,咱们一步步拆解排查:

排查EC2实例内部调用DRF API失败的问题

核心矛盾很明确:外部(Windows/本地Linux)能正常访问,内部不行,说明问题大概率出在EC2的网络配置、服务绑定规则或者本地安全策略上,而非DRF代码逻辑本身。

1. 先查Django服务的绑定地址

默认情况下,Django的runserver或gunicorn/uwsgi如果只绑定127.0.0.1,只能通过回环地址访问,但你外部能正常调用,说明服务应该是绑定了0.0.0.0或者实例的私网IP?不过还是得确认启动命令:

  • 用runserver的话,是不是加了0.0.0.0:PORT,比如:python manage.py runserver 0.0.0.0:8000
  • 用gunicorn的话,是不是绑定了0.0.0.0:PORT,比如:gunicorn myproject.wsgi:application --bind 0.0.0.0:8000

2. 别踩「内部调用公网IP」的坑!

这是AWS EC2的经典网络陷阱:实例内部直接访问自己的公网IP会被AWS的网络规则拦截,流量根本出不去也回不来。你内部测试时必须用实例的私网IP或者127.0.0.1(如果服务绑定了0.0.0.0)。

举个测试例子:

# 先试回环地址
curl http://127.0.0.1:PORT/api/your-endpoint
# 再试私网IP(用ip addr或ifconfig查看实例私网IP)
curl http://<私网IP>:PORT/api/your-endpoint

如果之前你用公网IP在内部调用,换成上面的地址大概率能解决问题。

3. 检查Django的ALLOWED_HOSTS配置

DRF依赖Django的ALLOWED_HOSTS规则,如果内部调用用的私网IP/回环地址没加到这个列表里,会直接返回400 Bad Request。

打开settings.py确认:

ALLOWED_HOSTS = ['<公网IP>', '<私网IP>', '127.0.0.1', 'localhost']

把你内部调用用到的地址都加进去。

4. 排查本地防火墙(iptables/ufw)

虽然外部能访问,但本地防火墙可能误拦截了内部流量。可以临时关闭防火墙测试:

# 针对ufw防火墙
sudo ufw disable
# 针对iptables
sudo iptables -F

如果测试正常,再重新配置防火墙规则,允许回环地址(127.0.0.0/8)和私网IP段的访问。

5. 快速定位问题的测试代码示例

如果你的测试代码有问题,试试这段简化版的Python测试脚本,能帮你明确报错类型:

import requests

# 替换成你的内部访问地址
url = "http://127.0.0.1:8000/api/your-test-endpoint"
# 或者用私网IP:url = "http://172.31.xx.xx:8000/api/your-test-endpoint"

try:
    response = requests.get(url)
    print(f"状态码: {response.status_code}")
    print(f"返回内容: {response.json()}")
except Exception as e:
    print(f"报错信息: {e}")
  • 如果提示Connection refused:要么服务没启动,要么绑定地址不对
  • 如果提示400 Bad Request:百分百是ALLOWED_HOSTS的问题
  • 如果提示超时:大概率是防火墙或安全组拦截了流量

内容的提问来源于stack exchange,提问作者iPaul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:34:08