Django和新服务器

时间:2016-06-03 11:08:50

标签: django database postgresql psycopg2

在我的服务器遭到入侵后,我不得不迁移到一个新的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 / via 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套接字吗?

1 个答案:

答案 0 :(得分:2)

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

我在这里假设你可以在服务器上安装psql。

立即检查:

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