Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django和新服务器上的PostgreSQL连接超时_Django_Database_Postgresql_Psycopg2 - Fatal编程技术网

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

Django和新服务器上的PostgreSQL连接超时,django,database,postgresql,psycopg2,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

在我的服务器被破坏后,我不得不迁移到一个新的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和ps auxw | grep postgres中看到几个PostgreSQL过程:

systemctl显示

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

我使用Django ORM从shell运行的任何查询都会返回上述错误。我可以从psql访问和运行查询,它返回的数据很好,所以PostgreSQL看起来正在运行,但Django由于任何原因都无法访问它。密码和用户名是正确的,尽管我认为在任何情况下都会抛出不同的错误。这没什么区别

我的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冻结显示:

我已检查是否安装了PostgreSQL、PostgreSQL contrib、libpq-dev-Python-dev

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

真正重要的是——这一切都在旧服务器上运行,我可以很好地运行ORM查询——但它不再是一个安全的服务器,包管理器坏了,所以我需要放弃它,需要新的服务器来工作。我看不出两者在配置上有什么不同——我想知道是否存在权限问题,但我和我的普通用户一样,在root/via sudo上运行同样的问题

我肯定有一个简单的配置设置我错过了,但我现在非常困惑

编辑:

抓取postgres主进程的PID并运行lsof可得出以下结论:

postgres 613 postgres 6u IPv4 11589 0t0 TCP本地主机:postgresql侦听 postgres 613 postgres 7u unix 0xffff8800d8e1cc00 0t0 11591/var/run/postgresql/.s.PGSQL.5432


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

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

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

立即检查:

你能从服务器ping服务器吗?如果没有,请从网络故障排除中开始。我看到这是localhost,但仍然尝试-它只需要很少的时间,至少验证了假设。 您能否使用相同的端口、ip地址等通过psql连接到服务器?如果您在尝试时没有纠正错误,请先尝试修复这些错误。同样的问题也会发生在这里。如果超时,您可能需要检查防火墙和postgresql配置。 一旦这些都工作,然后开始尝试从django再次。然后您就知道它是Django/Python特定的,没有服务器端。
好的,很有意思-我可以使用一个简单的命令psql进入psql,但是通过显式指令连接,psql-h127.0.0.1-p5432会给我同样的错误。如果我使用localhost而不是127.0.0.1,则相同。我试着把lsof的结果放在这里,但是格式很糟糕,q更新了。我最终通过这个过程得到了解决方案。按照第2点显式连接表明它不起作用。获取主进程的PID并运行lsof-p PID向我表明,它是在套接字上侦听的,而不是像我预期的那样在本地主机上侦听的。将主机设置更改为给我/var/run/postgresql/的目录,我离开了。
postgresql.service                   loaded active exited 
postgresql@9.4-main.service          loaded active running   
DATABASES = {
"default": {
    "ENGINE": "django.db.backends.postgresql_psycopg2",
    "NAME": "databasename",
    "USER": "databaseusername",
    "PASSWORD": "databasepasswordhere",
    "HOST": "localhost",
    "PORT": "5432",
    "CONN_MAX_AGE":360,
}
}
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