在两个不同的 EC2 实例上设置 Django 和 PostgreSQL

Posted

技术标签:

【中文标题】在两个不同的 EC2 实例上设置 Django 和 PostgreSQL【英文标题】:Setting Up Django and PostgreSQL on two different EC2 instances 【发布时间】:2012-11-05 15:09:30 【问题描述】:

你好 ***ers :) 到目前为止,我一直在同一个微型 EC2 实例上运行我的 Django 后端和我的 PostgreSQL 数据库。

我设置了两个 EC2 实例,一个带有我的 django 后端,另一个带有我使用 pgadminII 管理的 PostgreSQL 数据库的实例。两个实例使用相同的安全组并打开所有相同的端口。我已将一个弹性 IP 附加到我的 Django 实例,并将另一个弹性 IP 附加到我的 Postgresql 实例。

现在我知道在 settings.py 中我需要将“HOST”更改为 PostgreSQL 实例的地址。但我不太确定该放什么。我要放PostgreSQL实例的弹性IP吗?

我做了一些研究,许多消息来源说我需要输入 PostgreSQL 实例的内部服务器 IP 地址。如果是这种情况,我怎样才能找到内部服务器 IP 地址并将其输入到“主机”中?为了清楚起见,我复制并粘贴了下面的 settings.py 代码。

DATABASES = 
'default': 
'ENGINE': 'django.db.backends.postgresql_psycopg2', 
'NAME': 'django_db', 
'USER': 'django_login',
'PASSWORD': 'password', 
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.

感谢您的帮助,如果我不够清楚,请发表评论并告诉我,以便我为您和其他人更清楚:)

【问题讨论】:

【参考方案1】:

亚马逊支持

因此,在 David Wolever 回复后,我最终也与亚马逊的员工进行了交谈。以防万一你们中的任何人再次遇到这个帖子。仅使用内部服务器 IP 是不够的,但这是一个好的开始。如果您为 Postgresql 实例(最好是 Natty Narwhal)运行 Ubuntu,请确保编辑 pg_hba.conf 和 postgresql.conf 文件。

您通常可以在以下位置找到这两个文件:/etc/postgresql/8.4/main/(pg_hba.conf 或 postgresql.conf)

请注意,我们在堆栈中使用 Postgresql 8.4,在我们的测试中,它被证明是在 Natty Narwhal 上运行的最一致和最可靠的 Postgresql 版本。

对于不同版本的 Postgresql(9.1、9.0 等),您可以找到这两个文件的目录与上面列出的不同。确保您知道这些文件的正确目录。

第 1 步

转到 Amazon 管理控制台并确保两个实例都在同一个安全组下。 Postgresql 和 Django 默认使用 5432 和 8000,所以请确保你打开了这两个端口!

第 2 步

(在 postgresql 实例的终端上执行此操作)

sudo vim postgresql.conf

按键盘上的“i”开始进行更改。使用向下箭头键,直到遇到

LISTEN_ADDRESSES: 'localhost'

去掉前面的哈希标签,而不是'localhost',添加你的postgresql实例的私有IP(你可以在你的EC2管理控制台上找到私有IP)然后你还必须加上 127.0.0.1。

示例:

LISTEN_ADDRESSES: '私有 ip,127.0.0.1'

确保您用逗号分隔私有 ip 和本地主机地址,并将其全部放在一个引号内。

完成更改后,按 ESC 并按 ZZ(大写两次以保存更改)

第 3 步

sudo vim pg_hba.conf

使用向下箭头键,直到遇到如下所示的内容:

           Database administrative login by UNIX sockets
  local   all         postgres                          ident

  # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

  # "local" is for Unix domain socket connections only
  local   all         all                               md5
  # IPv4 local connections:
  host    all         all         127.0.0.1/32          trust
  # IPv6 local connections:
  host    all         all         ::1/128               md5
  local   django_db   django_login                      md5
  host    replication postgres    127.0.0.1/32          md5
  host    replication postgres    ::1/128               md5

再次按键盘上的“i”并按照我上面的方式对其进行更改。

您会注意到在 IPv6 下,我有 django_db 和 django_login,将其分别更改为您的 postgresql 数据库的名称和您用于 postgresql 数据库的用户登录名。

完成更改后,按 ESC 并按 ZZ(大写两次以保存更改)

第 4 步(Hi5 快完成了!)

在终端使用这个命令重启 postgresql 服务器:

sudo /etc/init.d/postgresql 重启

恭喜!服务器已启动并正在运行,但还有最后一步。

第 5 步

启动您的 Django EC2 实例,转到您的 settings.py 并查找以下内容:

 DATABASES = 
 'default': 
 'ENGINE': 'django.db.backends.postgresql_psycopg2', 
 'NAME': 'django_db', 
 'USER': 'django_login',
 'PASSWORD': 'password', 
 'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
 'PORT': '', # Set to empty string for default. Not used with sqlite3.
 

在 'HOST': ' ' 下,将其更改为 'HOST': '无论 Postgresql 实例的私有 IP 是什么'

保存更改。打开终端并找到 manage.py 文件所在的目录。 进入该目录后,运行以下命令:./manage.py syncdb

这些将为您在 Django 中创建的模型创建所有必要的表。恭喜,您已成功创建数据库实例和 Django 实例之间的链接。

如果您有任何问题,我很乐意为您提供帮助!在下面发表评论,我会尽快回复您! :)

【讨论】:

我的数据库服务器只在 ec2 上,而 Heroku 用于 Web 服务器。我也在使用 postgresql,在连接到 ec2 上的数据库服务器时遇到问题,请帮忙,谢谢! @whatf 给我发一封电子邮件,描述你的问题,让我看看能不能帮你解决【参考方案2】:

您的 Postgres 实例不需要弹性 IP。只需使用其内部 IP。内部 IP 可从管理控制台获得,或通过运行 ifconfig

【讨论】:

感谢大卫的快速回复!只是出于好奇,我是否需要在我的 postgreSQL 实例上安装 psycopg2 以外的任何东西才能使其工作和连接? 你甚至不需要安装 psycopg2。只需安装并运行 Postgres ;) 非常感谢大卫的帮助,非常感谢

以上是关于在两个不同的 EC2 实例上设置 Django 和 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

在具有不同端口的单个 EC2 上运行两个不同的 Web 应用程序

HTTPS 协议不适用于 ec2 实例上的 django 和 nginx

Django 频道 2 和 EC2 / Elasticbeanstalk

如何在 EC2 的不同机架中创建两个实例? (AWS 中的机架意识)

在EC2实例上设置SSL(FQDN)

将 EC2 实例连接到另一个 AWS 账户上的 RDS 卷