一位用户抱怨他的 PostgreSQL 客户端程序在空闲时经常与服务器断开连接。我正在尝试解决此问题。我在服务器日志中看到此类事件:
2022-06-15 15:18:20 EEST LOG: could not receive data from client: No connection could be made because the target machine actively refused it.
2022-06-15 15:18:20 EEST LOG: unexpected EOF on client connection
消息“无法建立连接,因为目标计算机主动拒绝”似乎是 Linux 的“连接被拒绝”的 Windows 版本;这是客户端在尝试连接服务器上的 TCP 端口时收到的消息,而服务器拒绝连接,通常是因为没有进程在监听该端口。
但这是服务器收到该消息。显然,客户端已成功连接到服务器的端口 5432。客户端和服务器一起工作,直到某个时候服务器“无法从客户端接收数据”。这怎么可能是“目标机器主动拒绝”连接呢?服务器不会尝试连接到客户端上的端口,对吗?(即使它尝试了,客户端也不太可能主动拒绝连接;更有可能的是它会超时,因为它的防火墙会过滤请求。)
那么这里的“目标机器”是什么,它拒绝什么样的连接?
这是 Windows Server 2019 64 位上的古老 PostgreSQL (8.3)。
答案1
这是因为对等点之间的路由器会主动关闭静默 TCP 连接。您需要通过更改 postgresql.conf 中的以下三行来启用 keepalive(自动 PING PONG)功能postgresql.conf
:
tcp_keepalives_idle = 20 # automatically send PING after 20 second silence
tcp_keepalives_interval = 10 # a PING is failed after 10 seconds without a PONG
tcp_keepalives_count = 3 # 3 failed PING's would trigger closing connection