我试图用mod_wsgi从python web应用程序连接到PostgreSQL Unix域套接字。 相关系统组件:
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