centos – 无法连接到PostgreSQL unix域套接字

前端之家收集整理的这篇文章主要介绍了centos – 无法连接到PostgreSQL unix域套接字前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试从 PHP Web应用程序连接到Postgresql Unix域套接字.相关系统组件:

> CentOS 7 x64(SELinux强制执行)
> postgresql93 9.3.5-2PGDG.rhel7
> Nginx 1.6.2-1.el7.ngx
> PHP-common 5.4.16-23.el7_0.3
> PHP-fpm 5.4.16-23.el7_0.3
> PHP-pdo 5.4.16-23.el7_0.3
> PHP-pgsql 5.4.16-23.el7_0.3

Postgresql正在监听标准端口5432,我在127.0.0.1:5432通过TCP / IP使用它没有问题,但是当我尝试连接到它的Unix域套接字时,我有以下错误

Cannot connect to database: sqlSTATE[08006] [7] 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"?

文件/tmp/.s.PGsql.5432存在,我可以使用psql连接:

$psql -Uusername db_name
psql (9.3.5)
Type "help" for help.

db_name=>

所以Postgresql方面应该没有问题.还是有吗?

来自/var/lib/pgsql/9.3/data/pg_hba.conf的相关行:

local    all    username        trust

在/var/lib/pgsql/9.3/data/postgresql.conf中更改Unix域套接文件的位置没有帮助:

unix_socket_directories = '/var/run/pgsql'

/var/log/audit/audit.log中没有任何内容,但我试图禁用SELinux,只是为了确定:

# setenforce 0

这没有用,所以它不是SELinux.

来自PHP-fpm的相关行:

[pid   882] socket(PF_LOCAL,SOCK_STREAM,0) = 5
[pid   882] fcntl(5,F_SETFL,O_RDONLY|O_NONBLOCK) = 0
[pid   882] fcntl(5,F_SETFD,FD_CLOEXEC) = 0
[pid   882] connect(5,{sa_family=AF_LOCAL,sun_path="/tmp/.s.PGsql.5432"},110) = -1 ENOENT (No such file or directory)
[pid   882] close(5)                    = 0

文件名是正确的,同样,文件/tmp/.s.PGsql.5432存在:

$ls -l /tmp/.s.PGsql.5432
srwxrwxrwx. 1 postgres postgres 0 Nov  1 09:47 /tmp/.s.PGsql.5432

看起来像PHP-fpm进程不是chroot’ed:

# ls -l /proc/882/root
lrwxrwxrwx. 1 apache apache 0 Oct 31 19:54 /proc/882/root -> /

在这一点上,我没有更多的想法可以解决问题,我将不胜感激任何帮助.

我已经解决了这个问题.它的最初原因是在PHP-fpm /usr/lib/systemd/system/PHP-fpm.service的systemd服务文件中:
[Service]
PrivateTmp=true

这意味着PHP-fpm无法看到/tmp/.s.PGsql.5432或/ tmp中的任何其他内容.
解决此问题,我已使用以下步骤更改了Postgresql Unix域套接文件的位置:

>创建一个新目录/ var / pgsql(注意更改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

>取消注释并修改/var/lib/pgsql/9.3/data/postgresql.conf中的unix_socket_directories参数(/ tmp仍然需要不破坏psql和其他程序):

unix_socket_directories = '/tmp,/var/pgsql'

这是另一个棘手的部分…在我写的原始帖子中,我试图改变Unix域套接文件的位置,我真的做到了.我错过的是更改的错误消息.我认为错误是一样的,但事实并非如此:

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"?

许可被拒绝 – 这是人们可以战斗的事情.

一切都有效

# setenforce 0

问题是:

# audit2allow -a

#============= httpd_t ==============
allow httpd_t initrc_t:unix_stream_socket connectto;

它可以修复:

# audit2allow -a -M httpd_postgresql_unix_socket_connect
# semodule -i httpd_postgresql_unix_socket_connect.pp

httpd_postgresql_unix_socket_connect.te的内容

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;

重新打开SELinux:

# setenforce 1

一切正常!

附:我很高兴知道是否有办法通过更改某些文件上下文或布尔值来避免自定义SELinux模块.可能是这种情况,因为SELinux允许Nginx使用PHP-fpm Unix域套接字(/var/run/PHP5-fpm.sock),但由于某种原因阻止使用Postgresql Unix域套接字(/var/pgsql/.s) .PGsql.5432).

猜你在找的CentOS相关文章