Eu resolvi o problema. A causa inicial foi no arquivo de serviço do systemd para php-fpm /usr/lib/systemd/system/php-fpm.service :
[Service]
PrivateTmp=true
Isso significa que o php-fpm não pôde ver /tmp/.s.PGSQL.5432 nem qualquer outra coisa localizada em / tmp . Para resolver o problema, mudei a localização do arquivo de soquete de domínio Unix do PostgreSQL com as seguintes etapas:
-
Crie um novo diretório / var / pgsql (observe a mudança do contexto do arquivo SELinux):
# mkdir /var/pgsql # chown posgres:postgres /var/pgsql # chmod 0755 /var/pgsql # semanage fcontext -a -t httpd_var_run_t "/var/pgsql(/.*)?" # restorecon -R /var/pgsql
-
Remova o comentário e modifique o parâmetro unix_socket_directories em /var/lib/pgsql/9.3/data/postgresql.conf ( / tmp ainda é necessário para não quebrar o psql e outros programas):
unix_socket_directories = '/tmp,/var/pgsql'
E aqui estava outra parte complicada ... Na postagem original, escrevi que tentei alterar a localização do arquivo de soquete do domínio Unix e realmente o fiz. O que eu perdi foi a mensagem de erro alterada. Eu pensei que o erro era o mesmo, mas não foi:
Error (256): Cannot connect to database: SQLSTATE[08006] [7] could not connect to
server: Permission denied
Is the server running locally and accepting
connections on Unix domain socket "/var/pgsql/.s.PGSQL.5432"?
Permissão negada - isso é algo que se pode combater.
Tudo funciona com
# setenforce 0
O problema é:
# audit2allow -a
#============= httpd_t ==============
allow httpd_t initrc_t:unix_stream_socket connectto;
E isso pode ser corrigido:
# audit2allow -a -M httpd_postgresql_unix_socket_connect
# semodule -i httpd_postgresql_unix_socket_connect.pp
Conteúdo do link :
module httpd_postgresql_unix_socket_connect 1.0;
require {
type httpd_t;
type initrc_t;
class unix_stream_socket connectto;
}
#============= httpd_t ==============
allow httpd_t initrc_t:unix_stream_socket connectto;
Ativar o SELinux novamente:
# setenforce 1
E tudo funciona!
P.S. Eu ficaria feliz em saber se existe uma maneira de evitar o módulo SELinux personalizado alterando alguns contextos de arquivo ou booleanos. Pode ser o caso, porque o SELinux permite que o nginx use o soquete do domínio Unix do php-fpm ( /var/run/php5-fpm.sock ), mas por algum motivo bloqueia o uso do soquete do domínio Unix do PostgreSQL ( /var/pgsql/.s.PGSQL.5432 ).