httpd.service Não é possível conectar ao banco de dados Centos 7

1

Estou tentando conectar ao soquete de domínio Unix do PostgreSQL de um aplicativo da Web python com o mod_wsgi. Componentes relevantes do sistema:

  • CentOS 7 x64
  • Python 2.7.5
  • SELinux desativado

O PostgreSQL está escutando na porta padrão 5432 e não tenho problemas em usá-lo via TCP / IP em 127.0.0.1:5432, mas quando tento conectar ao seu soquete de domínio Unix, tenho o seguinte erro:

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

O arquivo /tmp/.s.PGSQL.5432 existe e eu posso conectar usando psql .

No entanto, quando eu parar o apache com systemctl pare o httpd.service e reinicie-o novamente com /usr/sbin/httpd -DFOREGROUND , tudo funciona bem, incluindo as páginas que requerem acesso ao banco de dados

Com o SELinux desativado, não entendo porque há problemas quando o httpd começa com systemctl start httpd.service .

EDITAR:

Eu alterei unix_socket_directories = '/tmp,/var/pgsql_sock' em /var/lib/pgsql/9.3/data/postgresql.conf. Eu também mudei a configuração em setting.py no meu aplicativo django HOST='/var/pgsql_sock' . Agora funciona bem com o httpd.service.

    
por xav 30.03.2015 / 12:25

3 respostas

3

Você não pode usar /tmp para armazenar soquetes para comunicação entre processos neste cenário, porque o Apache usa private / diretórios tmp , um recurso de segurança que garante que um processo possa ver apenas seu próprio diretório / tmp; ele não pode ver o que outros processos escrevem em / tmp porque esses outros processos estão realmente gravando em diretórios diferentes.

Isso significa que o Apache não pode ver o soquete do PostgreSQL.

Você precisará continuar usando uma conexão TCP local.

Você também deve não desativar o SELinux e usar o booleano correto para permitir que o servidor da Web converse com o banco de dados .

    
por 30.03.2015 / 19:54
1

Sou mais fã de usar conexões TCP locais, como Michael Hampton apontou, mas você pode especificar manualmente outro diretório e / ou link simbolicamente para outro local que funcionará em torno desse problema.

Por exemplo:

mkdir /var/pgsql_socket/ 
ln -s /tmp/.s.PGSQL.5432 /var/pgsql_socket/

E aponte o Apache em / var / pgsql_socket

    
por 30.03.2015 / 20:13
1

Resolvido editando /var/lib/pgsql/9.3/data/postgresql.conf

unix_socket_directories = '/tmp/var/pgsql_sock'

Em seguida, emitido:

mkdir /var/pgsql_sock/

chown postgres:postgres  /var/pgsql_sock

editando o arquivo setting.py no meu aplicativo do django .....HOST='/var/pgsql_sock'

Agora funciona bem com o httpd.service

    
por 31.03.2015 / 15:37