httpd.service无法连接到数据库Centos 7

我试图用mod_wsgi从python web应用程序连接到PostgreSQL Unix域套接字。 相关系统组件:

  • CentOS 7 x64
  • Python 2.7.5
  • SELinux禁用

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

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

文件/tmp/.s.PGSQL.5432存在,我可以使用psql进行连接。

但是,当我停止apache与systemctl停止httpd.service并重新启动它与/usr/sbin/httpd -DFOREGROUND ,一切正常,包括需要访问数据库的网页

在禁用SELinux的情况下,我不明白为什么在httpd以systemctl start httpd.service启动时出现问题。

编辑:

我在/var/lib/pgsql/9.3/data/postgresql.conf中更改了unix_socket_directories = '/tmp,/var/pgsql_sock' 。 我也在我的django应用程序HOST='/var/pgsql_sock' 。 现在它可以正常使用httpd.service。

在这种情况下,您不能使用/tmp来存储进程间通信的套接字,因为Apache使用私有 / tmp目录 ,这是一个安全特性,可以确保进程只能看到自己的/ tmp目录; 它看不到其他进程写入/ tmp,因为其他进程实际上正在写入不同的目录。

这意味着Apache无法看到PostgreSQL套接字。

您将需要继续使用本地TCP连接。

您也不应禁用SELinux,并使用正确的布尔值来允许Web服务器与数据库进行通信 。

迈克尔·汉普顿(Michael Hampton)指出,我大多是使用本地TCP连接的粉丝,但是你可以手动指定另一个目录和/或象征性地链接到另一个位置来解决这个问题。

例如:

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

并指向/ var / pgsql_socket的Apache

通过编辑/var/lib/pgsql/9.3/data/postgresql.conf解决

 unix_socket_directories = '/tmp/var/pgsql_sock' 

然后发出:

 mkdir /var/pgsql_sock/ chown postgres:postgres /var/pgsql_sock 

编辑setting.py在我的django应用程序.....HOST='/var/pgsql_sock'

现在它可以正常使用httpd.service