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 服务器。
立即检查:
- 你能从服务器ping通服务器吗?如果不是,请从那里开始对网络进行故障排除。 (我看到这是本地主机,但仍然尝试——它只需要很少的时间并且至少验证了假设)。
- 您可以使用相同的端口、IP 地址等通过 psql 连接到服务器吗?如果在尝试时没有更正错误,请先尝试修复这些错误。很有可能这里也会出现同样的问题。如果超时,您可能需要检查防火墙和 postgresql 配置。
- 一旦这些工作正常,然后再次从 django 开始尝试。然后你知道它是 Django/Python 特定的,而不是服务器端。
在我的服务器受到威胁后,我不得不迁移到一个新的 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
在命令行上测试连接
这里真正的问题是 - 这一切都在旧服务器上工作,我可以 运行 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 服务器。
立即检查:
- 你能从服务器ping通服务器吗?如果不是,请从那里开始对网络进行故障排除。 (我看到这是本地主机,但仍然尝试——它只需要很少的时间并且至少验证了假设)。
- 您可以使用相同的端口、IP 地址等通过 psql 连接到服务器吗?如果在尝试时没有更正错误,请先尝试修复这些错误。很有可能这里也会出现同样的问题。如果超时,您可能需要检查防火墙和 postgresql 配置。
- 一旦这些工作正常,然后再次从 django 开始尝试。然后你知道它是 Django/Python 特定的,而不是服务器端。