2012-05-31 26 views
6

gasto dos horas para resolver estos problemas pero no alcancé nada. Hay varios temas sobre este problema en la red, pero ninguno de ellos dice una cosa absoluta para resolver esto.Postgresql y django - socket de dominio Unix

Acabo de instalar postgresql para usarlo en mi proyecto django.

DATABASES = { 
    "default": { 
     "ENGINE": "django.db.backends.postgresql_psycopg2", # Add "postgresql_psycopg2", "postgresql", "mysql", "sqlite3" or "oracle". 
     "NAME": "name",      # Or path to database file if using sqlite3. 
     "USER": "postgres",        # Not used with sqlite3. 
     "PASSWORD": "pass",       # Not used with sqlite3. 
     "HOST": "",        # Set to empty string for localhost. Not used with sqlite3. 
     "PORT": "",        # Set to empty string for default. Not used with sqlite3. 
    } 
} 

este es mi settings.py y el error es que

could not connect to server: No such file or directory 
    Is the server running locally and accepting 
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? 

¿Alguien tiene una solución al respecto?

+0

¿Por qué su 'HOST' y 'PORT' están vacíos? Si está ejecutando su servidor django localmente, entonces debe especificar al menos 'HOST': 'localhost' – stalk

+0

¿Cuál es su sistema y versión? ¿Cómo instaló Postgresql - desde el origen, desde el paquete de distribución o desde el instalador? ¿Has verificado que el servicio de Postgres realmente se está ejecutando? Dónde está el socket de Postgres - '/ var/run/postgresql/.s.PGSQL.5432' o'/tmp/.s.PGSQL.5432' o en otro lugar. ¿Eres capaz de conectarte usando 'psql'. Por un par de horas de trabajo, no proporciona mucha información para trabajar. – Tometzky

+0

Debian 6. el host y el puerto están vacíos porque estoy en el localhost no es necesario que lo llene – user1407540

Respuesta

15

Necesita localizar un socket postgres. Verifique el proceso principal de postgres pid (ps auxw | grep postgres) y liste sus conectores abiertos de Unix (lsof -p [PID_OF_POSTGRES_PROCESS] | grep unix). Escriba esta ruta en la opción HOST en settings.py.

Instalar Postgres desde el paquete de distribución (apt-get install postgresql) sería mucho más fácil (por ejemplo, HOST vacío en settings.py funcionaría) y más seguro ya que su distribución instalará actualizaciones de seguridad para usted.

+3

Además, como alternativa a 'lsof', la forma estándar sería simplemente buscar la entrada' unix_socket_directory' del archivo de configuración del servidor 'postgresql.conf'. –

+0

gracias. Funciona. apt-get install postgresql instala versiones anteriores de postgresql. Lo que hice es que acabo de instalar 9.1 desde el sitio oficial. apt-get install postgresql localiza donde django host pero manuel install instálalo en un directorio diferente. – user1407540

+2

La necesidad de la versión más nueva es un problema común que la mayoría de los administradores prefieren manejar utilizando [backports] (http://backports-master.debian.org/). Entre otros beneficios, como las actualizaciones automáticas, un respaldo de 9.1 habría evitado la falta de correspondencia biblioteca/servidor en las rutas que debía resolver aquí. –

11

Aquí hay otra posibilidad: si instaló una nueva versión de PostgreSQL sobre una versión existente, el instalador podría haberle asignado un número de puerto no estándar.

Django espera que PostgreSQL escuche en el puerto 5432. Incluso si usa conectores Unix, el conector toma su nombre del número de puerto, ¡así que esto sigue siendo importante!

Compruebe /etc/postgresql/<version>/main/postgresql.conf para la línea port = nnnn. Si ese número no es 5432, ese es tu problema. Otro indicador es que su archivo de socket en /var/run/postgresql se llamará algo así como .s.PGSQL.5433, utilizando el número de puerto no estándar.

Para solucionarlo, puede editar el número de puerto en postgresql.conf utilizar el valor por defecto (5432), o si necesita que se ejecute en un número de puerto no estándar, a continuación, establecer DATABASE_PORT = 'nnnn' en su Django settings.py.

¡Gracias a Erik Forsberg por el puntero!

2

En los sistemas contemporáneos de Fedora, se ha agregado una función de directorio temporal privado que causará este síntoma. https://fedoraproject.org/wiki/Features/ServicesPrivateTmp

Esta función hace que las aplicaciones web utilicen un directorio tmp diferente del directorio system/tmp donde se encuentra el dominio predeterminado de PostgreSQL.

Para cambiar la directiva systemd para esta función para Apache httpd-en Fedora, edite el archivo /usr/lib/systemd/system/httpd.service y cambiar PrivateTmp=true-PrivateTmp=false

Como alternativa, se puede evitar el uso de conectores de dominio para evitar este problema.

Cuestiones relacionadas