【问题标题】:Django 1.11 can't connect to Postgres on RDSDjango 1.11 无法连接到 RDS 上的 Postgres
【发布时间】:2018-06-11 04:56:41
【问题描述】:

我在 RDS 上使用 Postgres 创建了一个新的 EC2 实例。我确认我可以使用 psql 从 EC2 实例连接到数据库而没有任何问题,这意味着我的安全设置很好。

但是,当我尝试运行 manage.py runservermanage.py dbshell(来自 virtualenv)时,Django 挂起,然后最终给出超时错误:

psql: could not connect to server: Connection timed out 是服务器 在主机“whatever.rds.amazonaws.com”上运行 (172.xxx.xxx.xxx) 并接受端口 5342 上的 TCP/IP 连接?

Traceback(最近一次调用最后一次):文件“manage.py”,第 22 行,在 execute_from_command_line(sys.argv) 文件“/home/ubuntu/Env/xxxx/lib/python3.5/site-packages/django/core/management/init.py”, 第 363 行,在 execute_from_command_line 实用程序.execute()

文件“/home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/init.py”, 第 355 行,执行中 self.fetch_command(子命令).run_from_argv(self.argv)

文件“/home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/base.py”, 第 283 行,在 run_from_argv self.execute(*args, **cmd_options)

文件“/home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/base.py”, 第 330 行,执行中 输出 = self.handle(*args, **options)

文件“/home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/commands/dbshel​​l.py”, 第 22 行,在句柄中 连接.client.runshell()

文件“/home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/db/backends/postgresql/client.py”, 第 66 行,在 runshell 中 DatabaseClient.runshell_db(self.connection.get_connection_params())

文件“/home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/db/backends/postgresql/client.py”, 第 58 行,在 runshell_db subprocess.check_call(args)

文件“/usr/lib/python3.5/subprocess.py”,第 581 行,在 check_call 中 raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command '['psql', '-U', 'db_name', '-h'、'whatever.rds.amazonaws.com'、'-p'、'5342'、'user_name']' 返回非零退出状态 2

我尝试创建 Django 应用程序的新副本以查看是否可能涉及损坏的文件,并尝试对我的 settings.py 文件进行一些更改,但没有运气。

有什么想法吗?

编辑

Settings.py(重要部分)

DEBUG = False

ALLOWED_HOSTS = ['localhost', '0.0.0.0', '127.0.0.1', 'compute.amazonaws.com']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'database_name',
        'USER': 'xxxxxxxx',
        'PASSWORD': 'xxxxxxxx',
        'HOST': 'whatever.us-west-2.rds.amazonaws.com',
        'PORT': '5342',
    }
}

【问题讨论】:

  • 从 EC2 CLI 执行 psql -U db_name -h something.rds.amazonaws.com -p 5432 user name 连接没有问题吗?
  • @DmitryPolonskiy - 是的,我可以使用 EC2 CLI 中的 psql 命令毫无问题地连接。我彻底糊涂了!
  • 您的manage.py 文件中有类似os.environ.setdefault("DJANGO_SETTINGS", "settings") 的内容吗?你也试过把主机改成localhost
  • @DmitryPolonskiy 该应用程序在我的开发机器上的本地主机上运行良好,是的,我确实在 manage.py 中有环境设置。我正忙着在 EC2 实例上设置 postgres,看看我是否可以这样连接。
  • @Paolo 我将 AWS 用于不同的 postgres 系统,我们通过更改安全组进行了类似的操作,直到一切顺利。我们没有发现任何安全问题,但我不会声称自己是专家。

标签: python django postgresql amazon-ec2


【解决方案1】:

我最终在 EC2 服务器上创建了一个本地 postgres 数据库,以查看是否出现任何错误。当我尝试运行makemigrationsmigrate 来设置数据库时,出现“关系不存在”错误。堆栈跟踪指向我的一个视图中的一行,看起来像这样:

some_queryset = Model.objects.all()
some_queryset.delete() # <--- this line was the problem

尽管这在技术上是删除给定表中所有条目的可接受方式,但 Django(在服务器上)不喜欢给定模型的关系不存在这一事实。

我注释掉了该行,并且能够毫无问题地连接到数据库。

因此,对于未来的读者来说——如果您的 Django 应用程序在 runserver 上挂起,但您可以从 EC2 实例访问 RDS 数据库,请尝试设置本地数据库以检查是否存在任何问题。

【讨论】:

    【解决方案2】:

    exit status 2 通常意味着您使用错误的参数调用了 psql。对我来说,psql 身份验证错误也触发了此退出代码。我的问题最终是 settings.DATABASES['default'] 正在使用的 DBPASSWORD 环境变量中的拼写错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-12
      • 2016-05-02
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 2018-05-19
      相关资源
      最近更新 更多