SFTP 备份任务在 Debian 上遇到网络问题,无法重新连接

SFTP 备份任务在 Debian 上遇到网络问题,无法重新连接

我的 Debian 服务器上的 PHP 计划任务出现了问题。每天晚上,我都会将数据备份从服务器 S1 发送到服务器 S2。这两台服务器是专用服务器,但不在同一位置托管。

备份由使用 phpseclib 的 Net_SFTP 发送的多个文件(从 300MB 到 5GB)组成,并在 0h 到 4h 之间设置了多个计划计时器,以免占用太多网络连接资源。

每天晚上,我都会遇到 3-4 个文件的问题,传输过程中出现网络错误(通常是在达到 100k 毫秒时,因此可能是超时),然后重试失败,没有连接问题(0.1 毫秒,对于网络问题来说非常快)。它可能在夜间的任何时间发生(今天 3 点 14 分,昨天 3 点 50 分),当它切断时,当时正在传输的所有文件都会得到完全相同的日志(只有第一次尝试传输的时间会发生变化)。它从来都不是同一个文件,一个文件可能连续 3 天失败,但在本周的其余时间里却运行良好。

当我检查网络图上的资源消耗时,我发现 S1 和 S2 之间的连接所能处理的带宽尚未达到最大值。当我要求 S2 的主机查看日志时,他们什么也没看到,并告诉我查看 S2 上的系统日志以了解发生了什么。

我是 S1 和 S2 的根,所以我可以检查任何日志,但我不知道在哪里查找(以及搜索什么)。

答案1

在 php 错误日志中搜索后,我发现一条通知:

PHP 通知:/usr/share/php/Net/SSH2.php 第 yyyy 行中的连接过早关闭 PHP 通知:/usr/share/php/Net/SSH2.php 第 xxxx 行中的连接已被服务器关闭 PHP 通知:/usr/share/php/Net/SSH2.php 第 xxxx 行中的连接已被服务器关闭

在文件 SSH2.php 的第 xxxx 行,我发现连接失败时 $this->fsock 没有重置,测试 if (!is_resource($this->fsock)) 仍然为假,然后 fsockopen 没有再次完成。

我将 Net_SFTP 类设置为空,并在重试期间执行新的 Net_SFTP(),并且我不再遇到此问题(我仍然有无法识别的网络中断,但现在可以重试)。

相关内容