如何在EC2上开发Django以便互联网可以访问?

时间:2015-05-13 14:44:59

标签: django amazon-ec2

我有Django应用程序。它在EC2上运行。 EC2具有私有IP地址和弹性公共IP地址。

我希望网络应用在本地可用,以及开发人员在网络外的IP地址。

让我们将这三个IP地址定义为:

EC2_PRIVATE_IP
EC2_PUBLIC_IP
DEVELOPER_IP

所以我所做的是在EC2上运行:

python manage.py runserver 0.0.0.0:8000

进入我的EC2安全设置,并打开入站和出站端口8000到DEVELOPER_IP。

然后要求开发人员在他的浏览器上转到EC2_PUBLIC_IP地址。

不幸的是,当他收到错误时,它不起作用:

Gateway Timeout: can't connect to remote host

更新#1

我之前尝试过:

python manage.py runserver {EC2_PUBLIC_IP}:8000

但是我得到了错误:

Error: That IP address can't be assigned-to.

7 个答案:

答案 0 :(得分:6)

应使用以下网址启动服务器

python manage.py runserver 0.0.0.0:8000

在EC2安全设置中,在INBOUND设置中添加以下内容

HTTP TCP 8000 0.0.0.0/0

然后你应该使用URL

访问这台机器
http://EC2_PUBLIC_IP:8000

如果您想以

的身份访问网址
http://EC2_PUBLIC_IP

然后在端口80上运行您的网络服务器,并相应地更改EC2安全设置。

答案 1 :(得分:1)

这里的所有答案都给出了解决方案,我想发布此内容以便完整。

默认情况下,runserver命令在端口8000的内部IP上启动开发服务器。

如果要更改服务器的端口(用于Internet访问的标准端口为80),请将其作为命令行参数传递。例如,此命令在端口80上启动服务器:

  

$ python manage.py runserver 80

注意:您不希望用户在浏览器中的网址后输入:port_number 。另一件事是您可能不是主机的所有者,因此您可能无权配置防火墙设置以允许其他端口超过80.

如果要更改服务器的IP,请将其与端口一起传递。因此,要收听所有公共IP(如果您想在网络上的其他计算机上展示您的工作,这非常有用),请使用:

  

$ python manage.py runserver 0.0.0.0:80

可以找到有关开发服务器所需知识的文档here

答案 2 :(得分:0)

从您的出站安全组中删除所有规则,并替换为"所有流量"宽容规则。

您的计算机正在获取入站数据包,但安全过滤器会拒绝其回复。您的开发人员将使用(semi-) arbitrary source port number发送数据包。

(另外,您无法绑定到EC2实例上的公共地址,因为它是由路由基础设施从私有地址转换而来的,所以它实际上并不是" on&# 34;你的盒子。)

答案 3 :(得分:0)

确保您的防火墙没有阻止任何内容。

尝试

iptable -F 

这将删除计算机本身的所有防火墙规则。

编辑:但是,你不应该使用它。如果要为防火墙添加端口,请使用以下表示如果您正在运行基于redhat的发行版(例如centos,rhel)

system-config-firewall

如果不存在,请尝试安装

# yum install system-config-firewall # run it after becoming a root

答案 4 :(得分:0)

除了添加防火墙规则以允许流量到端口8000 /其他

您必须运行开发服务器,以便它监听所有接口上的请求,而不仅仅是本地接口上的请求

python manage.py runserver 0.0.0.0:8000 

或您可以选择的任何其他端口

答案 5 :(得分:0)

让Django应用程序在本地运行并尝试在ec2实例中安装nginx并将端口80上的流量代理到localhost:8000。 像这样:

server {
listen 80;
server_name www.yoursite.com;
client_max_body_size 1000M;

location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 1000;
proxy_read_timeout 1000;
proxy_pass http://127.0.0.1:8080/; # This is the trick !
proxy_buffering off;
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
}

}

您可以添加控件以仅为开发人员IP提供服务。 Nginx是一款轻巧,快速,安全,轻便的产品。可扩展的Web /代理服务器。世界上最繁忙的网站使用NGINX! 它将作为服务运行,它将监听来自外部世界(Internet)的所有流量,在您的情况下,您可能希望告诉它侦听Web(端口80)流量,并将其重定向到您的Django app(在端口8000上运行);这是一个不错的主意,它是透明的,而且,如果调整得很好,它将增强您的网站! 此外,Nginx非常适合网络和移动应用交付。 nginx的安装和配置非常简单,您应该将类​​似于上面示例的内容集成到它中,以使您的应用程序对Internet开放。

答案 6 :(得分:0)

我明白了。我也需要在Windows防火墙上打开端口!