gpt4 book ai didi

django - Django 和新服务器上的 PostgreSQL 连接超时 OperationalError

转载 作者:搜寻专家 更新时间:2023-10-30 22:35:46 25 4
gpt4 key购买 nike

在我的服务器受到威胁后,我不得不迁移到一个新的 Droplet - 都在 DigitalOcean 和 Debian Jessie 上,所以我不应该遇到许多类似问题似乎涵盖的 Heroku 问题。

我使用 pg_dump 复制了数据库,它看起来完好无损。 PostgreSQL 已安装并正在运行,但每当我尝试使用 Django ORM 中的数据库时,我都会收到错误消息 -

OperationalError: could not connect to server: Connection timed out
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?

所以,首先是一些显而易见的事情。

Netstat 显示:

tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      613/postgres    
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 554/redis-server 12

我可以在 top 中看到几个 PostgreSQL 进程并使用 ps auxw | grep postgres:

 1072 postgres  20   0  234680 129672 126676 S   6.0  3.2   3:06.98 postgres: me databasename [local] COPY                                          +
640 postgres 20 0 227000 119564 117876 S 0.3 2.9 0:03.77 postgres: checkpointer process +
613 postgres 20 0 226712 21252 19824 S 0.0 0.5 0:00.05 /usr/lib/postgresql/9.4/bin/postgres -D /var/lib/postgresql/9.4/main -c config_f+
641 postgres 20 0 226712 5556 4080 S 0.0 0.1 0:02.59 postgres: writer process

systemctl 显示

postgresql.service                   loaded active exited 
postgresql@9.4-main.service loaded active running

psycopg2 已安装,我正在 virtualenv 内部工作。

我使用 Django ORM 从 shell 运行的任何查询都会返回上述错误。我可以从 psql 访问和运行查询,它返回数据正常,因此 PostgreSQL 似乎正在运行,但 Django 出于某种原因无法访问它。密码和用户名是正确的,尽管我认为无论如何都会引发不同的错误。 Restarting the service没有区别。

我的 Django 设置是:

DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": "databasename",
"USER": "databaseusername",
"PASSWORD": "databasepasswordhere",
"HOST": "localhost",
"PORT": "5432",
"CONN_MAX_AGE":360,
}
}

(我已经尝试将 localhost 和 127.0.0.1 作为主机,以防它是 IPv4/IPv6 解析问题,尽管不太可能)pip freeze 显示:

Django==1.9.6
argparse==1.2.1
click==6.6
django-extensions==1.6.7
django-redis==4.4.3
django-redis-cache==1.6.5
django-rq==0.9.1
django-rq-dashboard==0.3.0
gunicorn==19.5.0
hiredis==0.2.0
newrelic==2.64.0.48
nltk==3.2.1
oauthlib==1.1.1
psycopg2==2.6.1
requests==2.10.0
requests-oauthlib==0.6.1
rq==0.6.0
six==1.10.0
tweepy==3.5.0
wsgiref==0.1.2

Per this question,我检查过是否安装了 PostgreSQL、PostgreSQL-contrib、libpq-dev Python-dev。

在命令行上测试连接 as per this question抛出同样的错误。

这里真正的问题是——这一切都在旧服务器上工作,我可以运行 ORM 查询就好了——但它不再是一个安全的服务器,包管理器坏了,所以我需要放弃它,并且需要新的工作。我看不出两者之间的配置有任何差异——我想知道是否存在权限问题,但我以普通用户身份以 root/通过 sudo 运行时遇到了同样的问题。

我确定我错过了一个简单的配置设置,但我现在很困惑!

编辑:

不过,获取 postgres 主进程的 PID 并运行 lsof 会给出:

postgres 613 postgres 6u IPv4 11589 0t0 TCP localhost:postgresql (LISTEN)
postgres 613 postgres 7u unix 0xffff8800d8e1cc00 0t0 11591/var/run/postgresql/.s.PGSQL.5432

这看起来很奇怪。它是否默认为 Unix 套接字?

最佳答案

连接超时错误表明无法通过网络以不返回立即错误的方式使用您的设置访问数据库服务器。根据我的经验,最好的方法是分别对连接的两端进行故障排除。这意味着首先从 psql 命令行测试连接的服务器端,然后在问题解决后测试 django 端。

我假设您可以在服务器上安装 psql.

立即检查:

  1. 你能从服务器 ping 服务器吗?如果不是,请从那里开始对网络进行故障排除。 (我看到这是本地主机,但仍然尝试——它只需要很少的时间,至少可以验证假设)。
  2. 您能否使用相同的端口、IP 地址等通过 psql 连接到服务器?如果在尝试时没有更正错误,请先尝试修复这些错误。很有可能这里也会出现同样的问题。如果超时,您可能需要检查防火墙和 postgresql 配置。
  3. 一旦这些工作正常,然后再次从 django 开始尝试。那么您就知道它是特定于 Django/Python 的,而不是服务器端。

关于django - Django 和新服务器上的 PostgreSQL 连接超时 OperationalError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37612800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com