我们有一个产品,其中本地 linux 机器“SCANNER”在本地网络上进行一些轮询,然后使用 pg_query(服务器运行 PostgreSQL 9.5.5)通过 OpenVPN 连接将信息填充到我们云服务器中的数据库中。
SCANNER 上有一个 PHP (5.5.9) 守护程序,它在“while”循环中检查数据库以完成工作。这一直很有效,并且继续在我们所有的客户网络上运行良好,除了一个最近出现了一个奇怪的问题。
在他们升级了防火墙(一个 Checkpoint 5200,据我们所知,所有规则都是正确的,允许通过 VPN 从 SCANNER 到我们的云服务器的流量),一个脚本中的一个查询无限期挂起。以下是我们注意到的症状:
大多数情况下,查询工作正常,脚本继续。每隔一段时间,pg_query() 调用就会阻塞并且永远不会返回。并不是说有错误;该调用实际上会永远阻塞(或者在我们手动重新启动之前的几个小时)。
这个查询很长一段时间都是一样的,在我们的任何其他客户端上,我们从来没有遇到过这个问题,也没有在这个客户端上遇到过这个问题,直到他们改变了他们的防火墙。
我们可以通过查看云服务器上的 pg_stat_activity 表来判断该查询确实到达了云,然后永远位于该表中。在每种情况下,pg_stat_activity.state='idle' 和 pg_stat_activity.waiting=false
在此期间,我们仍然可以通过 VPN 从 SCANNER ping 云服务器,并且可以继续从 SCANNER 上的其他脚本和 SCANNER 的命令行成功查询其远程数据库。
这个客户端碰巧有两台不同的 SCANNER 机器,在不同的子网上但在同一个防火墙后面。此问题可能随时出现在任何一个上,但不一定同时出现在两个上(至少没有任何统计意义)。
如果我们重新启动守护进程,问题就暂时解决了。但它通常会在 2 秒到几个小时后的某个时间再次出现。
我们正在寻找任何可能解决问题的输入,无论是与我们的应用程序还是防火墙本身(我们已获得根据需要进行修改的权限)相关。随时提出任何澄清问题。
提前致谢!