我正在尝试从 PHP Web应用程序连接到Postgresql Unix域套接字.相关系统组件:

> 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 -> /

在这一点上,我没有更多的想法可以解决问题,我将不胜感激任何帮助.

我已经解决了这个问题.它的最初原因是在PHP-fpm /usr/lib/systemd/system/PHP-fpm.service的systemd服务文件中:
[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).

centos – 无法连接到PostgreSQL unix域套接字的更多相关文章

  1. 配置iOS VoIP应用程序以在睡眠/后台模式下运行

    我正在开发基于VoIP的iOS(7.1)应用程序.它的底层套接字编程是用C而不是客观C编写的.应用程序在前台运行良好,但在进入睡眠/后台模式时,它无法从服务器接收任何通信.根据apple文档,我们必须为VoIP使用配置一个appsocket.我无法弄清楚如何配置C套接字.目的是在睡眠模式下运行应用程序,直到它被杀死.从SO中尝试了几个链接甚至几个链接,但由于我是新手,我希望这个配置有一步一步的过程.[注意:在某个地方我发现了CoreFoudation框架,我是否需要使用它?

  2. 我应该使用哪个高级API来管理iOS上的UDP套接字?

    在“NetworkProgrammingTopicsConceptualGuide”的“UsingSocketsandStreams”一章中,Apple说:Note:POSIXnetworkingdoesnotactivatethecellularradiooniOS.Forthisreason,thePOSIXnetworkingAPIisgenerallydiscouragediniOS.同样

  3. ios – 200在xcode 7中生成DSMM警告

    解决方法我有同样的问题.Facebook表示他们已经意识到这一点并且不是高优先级,因为它不会影响应用程序.我回退到4.7.1警告问题不再存在.我不认为它会被拒绝但不能确定.

  4. iOS:使用CFStreamCreatePairWithSocketToHost的套接字网络基础

    >每次要发送新数据对象时,是否设置了新套接字?>我是否必须重置outputStream并发送更多数据.码大部分代码来自CocoaStreamsDocumentation:响应:请注意,在发送数据后,outputStream流将关闭.我尝试在[selfsendString:@“AnotherTest”]之前重新启动outputStream.我也试过了idz的回答.根据文档,我相信len:0的发送缓冲区是我的问题.IfthedelegatereceivesanNsstreamEventHasspaceAvai

  5. xamarin.ios – Facebook iOS SDK:应用程序在启动时找不到“找不到符号:_ACFacebookAppIdKey.”仅在iOS 5中崩溃

    解决方法这是一个已修复的knownbug.目前唯一已知的解决方法是使用较旧版本的FacebookSDK.

  6. osx – 无法创建目录/ var / teamsserver

    OpenSSH_6.2p2,OSSLShim0.9.8r8Dec2011debug1:Readingconfigurationdata/etc/ssh_configdebug1:/etc/ssh_configline20:Applyingoptionsfor*debug1:Connectingto1.2.3.4[1.2.3.4]portPORT.debug1:Connectionestablished.Couldnotcreatedirectory‘/var/teamsserver/.ssh’.debug

  7. ios – 如何在Xcode 4.5中完成代码签名

    解决方法事实证明,从AppStore升级XCode并不会自动升级所有内容.转到首选项/下载,并确保安装最新的命令行工具.

  8. xcode7 – 谁在创建文件“/private/var/tmp/Untitled-*.uicatalog”?

    我正在调查为什么TeamCity构建代理程序用完了磁盘,并且在/private/var/tmp中找到了超过11,000个文件,它们都以Untitled-.uicatalog行命名.每个文件至少0.6MB.总磁盘占用空间约为4GB.这些文件可以追溯到几个月,所以他们能够重新启动.谁在创造他们?Xcode在编译至少有一个图像的xcassets目录时创建这些目录.我可以删除它们吗?

  9. ios – AFNetworking / NSURLConnection接收NSPOSIXErrorDomain代码= 9“操作无法完成.坏文件描述符“

    有人在他们的AFNetworking操作中遇到这个错误吗?此外,如果我真的想要,如何故意关闭这个文件描述符?

  10. ios – Client.ipa不包含文件

    从过去的几天开始,我就把这头发错了.当我尝试提交基于cordova的iOS应用程序时,我收到一个错误,即符号工具失败.这就是我在日志中的内容:以下是尝试提交到应用商店时所述错误的屏幕截图:请帮忙.解决方法我有同样的错误,因为应用程序包中错误地包含了几个静态库(libXXX.a).它们显示在主.App下的最终上传确认框(列出权利和证书)中.我的解决方案是从项目中删除对这些静态库的所有引用,在链接器标

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部