连接 EC2 Django 开发服务器

27

我刚刚开始学习EC2和Web开发。当前我有一台运行Linux的EC2实例,并已安装了Django。在开始我的真正项目之前,我正在创建一个测试项目并尝试运行Django测试服务器。

这是我的终端输出:

python manage.py runserver ec2-###-##-##-##.compute-1.amazonaws.com:8000
Validating models...

0 errors found
Django version 1.3, using settings 'testsite.settings'
Development server is running at http://ec2-###-##-##-##.compute-1.amazonaws.com:8000/
Quit the server with CONTROL-C.

为了测试它是否正常工作,我尝试访问:ec2-###-##-##-##.compute-1.amazonaws.com:8000,但我总是在浏览器中收到“无法连接”的消息。

然而,当我在本地计算机上执行此操作时,我成功地进入了位于127.0.0.1:8000的Django开发主页。有人能帮我弄清楚我在EC2实例上执行此操作时做错了什么/可能遗漏了什么吗?


以下答案对我有用。基本上是将EC2实例设置为监听端口8000。在此处查看答案:https://dev59.com/05Lea4cB1Zd3GeqP4qCY#34577101 - oz19
6个回答

51

在使用Ubuntu的EC2实例时,我发现指定0.0.0.0:8000是有效的:

$python manage.py runserver 0.0.0.0:8000  

当然,在安全组设置中需要打开TCP端口8000。


您还需要确保该端口尚未被使用。 - bozdoz
2
这是针对此问题的正确回答。谢谢。 - Leonardo Brambilla
如何在安全组中打开TCP 8000端口。我的出站流量设置为所有流量。但它还没有生效。 - Aseem

26

你可能没有在防火墙上打开8000端口。检查实例正在运行的安全组(可能是“默认”),并检查其运行的规则。您可能会发现,端口8000未列出。


好的,我在UDP、TCP和ALL中加了8000到ICMP,并将源设置为“default”,但仍然无法连接到端口8000。这是否意味着Django可能无法工作,还是亚马逊EC2服务器上的防火墙仍在起作用?非常感谢您的帮助! - Mars J
打开第二个连接到同一台机器,尝试telnet到80端口,telnet localhost 80,然后输入GET /并按几次回车键。如果无法连接,则runserver未正常工作;如果可以连接并从GET获取HTML,则问题在服务器和您所在位置之间。 - KayEss
当然,那应该是端口8000。如果你在Debian/Ubuntu系统上,可以通过类似于“sudo apt-get install telnet”的方式安装Telnet。 - KayEss

10

1)您需要确保将8000端口作为自定义TCP规则添加到入站端口的安全组列表中。

2)很有可能您在AWS控制台上看到的IP地址,与您的实例相关联的是一个公共IP或公共域名(如ec2-###-##-##-##.compute-1.amazonaws.com或174.101.122.132),这是由Amazon分配的。

2.1)如果它是一个公共IP,则您的实例无法知道分配给它的公共IP是什么,而只会知道其分配的本地IP。

2.2)要在Linux系统上获取本地IP,请键入:

    $ ifconfig

然后查看eth0数据,你会看到格式为xxx.xxx.xxx.xxx(例如10.10.12.135)的“inet addr”旁边有一个IP地址,这就是你的本地IP

3)要成功运行服务器,可以执行以下两个步骤之一:

    $ python manage.py runserver <LOCAL IP>:8000
    or
    $ python manage.py runserver 0.0.0.0:8000

**正如Ernest Ezis在他的答案中提到的那样,Option Two也非常有效。 编辑:来自Django Book: "IP地址0.0.0.0告诉服务器侦听任何网络接口"

**我的公共IP理论可能是错误的,因为我不确定Amazon如何分配IP。 我希望被纠正。


谢谢!你的第一步“你需要确保将端口8000作为自定义TCP规则添加到入站端口的安全组列表中”是我所需要的。之后,python manage.py runserver 0.0.0.0:8000 就像魔法一样顺利运行了! - Patrick Coffey
如何进行第一步? - vijay shanker
@vijayshanker 登录您的EC2控制台 -> 实例 -> 从列表中选择实例 -> 底部菜单中的“安全性” -> 入站规则 -> 编辑 -> 添加规则 - Shmack

2

我曾经遇到过同样的问题,但是我在EC2上运行的是RHEL。除了在安全组中添加规则之外,我还需要手动将端口添加到firewalld中。

firewall-cmd --permanent --add-port=8000/tcp
firewall-cmd --reload

这对我有用!(尽管我不知道为什么必须这样做)


在CENTOS7上,以下操作对我有效。在使用firewall-cmd打开防火墙端口之前,我无法从ec2-###-##-##-##.compute-1.amazonaws.com:8000访问测试页面。试过这个方法之后,它立即出现了。 - eculeus
运行这些命令后,我再也不能通过 SSH 连接我的 EC2 实例了。一直显示连接超时。我猜这创建了一个新的防火墙规则,只允许端口 8000 连接到该机器,这导致我无法使用端口 22(SSH)连接到我的实例。现在我失去了对我的实例的访问权限,非常感谢,伙计。 - rekxspein
运行了这些命令之后,我再也无法通过SSH连接到我的EC2实例了。一直显示连接超时。我猜这可能创建了一个新的防火墙规则,只允许端口8000连接到这台机器,这导致我无法使用端口22(SSH)连接到我的实例。现在我失去了对实例的访问权限,真是太糟糕了。谢谢你,伙计。 - undefined

1

是的,如果您使用快速启动 EC2 选项,则应添加新的 HTTP 规则(与列表中显示的规则相同),以运行开发服务器。


1
你能澄清一下“就像列表上显示的那样”吗? - pjmorse
@pjmorse,在安全组中为该实例添加一条规则。 - Random Integer

1

添加一个安全组,其入站规则如下通常可以解决问题,除非您有其他配置错误。端口范围指定您要允许传入流量的端口。

  • HTTP 访问需要 80
  • 通过端口8000的HTTP访问需要 8000
  • 连接服务器的SSH需要 22
  • HTTPS 需要 443

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接