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

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

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

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

编辑:

我已在 /var/lib/pgsql/9.3/data/postgresql.conf 中进行了更改。我还在django 应用程序中unix_socket_directories = '/tmp,/var/pgsql_sock'更改了配置。现在它可以与 httpd.service 配合使用。setting.pyHOST='/var/pgsql_sock'

答案1

/tmp在这种情况下,您不能使用它来存储用于进程间通信的套接字,因为 Apache 使用私人的/tmp 目录,一项安全功能,可确保进程只能看到自己的 /tmp 目录;它无法看到其他进程写入 /tmp 的内容,因为其他进程实际上是写入不同的目录。

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

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

您还应该不是禁用 SELinux,并且使用正确的布尔值允许 Web 服务器与数据库通信

答案2

正如 Michael Hampton 指出的那样,我非常喜欢使用本地 TCP 连接,但是你手动指定另一个目录和/或符号链接到另一个位置来解决此问题。

例如:

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

并将 Apache 指向 /var/pgsql_socket

答案3

通过编辑 /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

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

现在它可以与 httpd.service 一起正常运行

相关内容