> 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 -> /
在这一点上,我没有更多的想法可以解决问题,我将不胜感激任何帮助.
[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).