我正在尝试使用 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.py
HOST='/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 一起正常运行