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

PostgreSQL Connection Timed Out OperationalError on Django and new server

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

我使用 pg_dump 复制了数据库,它看起来完好无损。已安装 PostgreSQL,并且 运行ning,但每当我尝试使用 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 内部工作。

我运行从shell使用Django ORM的任何查询return出现上述错误。我可以从 psql 访问和 运行 查询,它的 returns 数据很好,所以 PostgreSQL 似乎是 运行ning,但 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

我已经检查了 PostgreSQL、PostgreSQL-contrib、libpq-dev Python-dev 已安装。

在命令行上测试连接 会引发相同的错误。

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

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

编辑:

抓取 postgres 主进程的 PID 和 运行ning 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 套接字?

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

我假设您可以安装 psql.on 服务器。

立即检查:

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