![SFTP 備份任務出現網路問題,無法在 debian 上重新連接](https://rvso.com/image/1641919/SFTP%20%E5%82%99%E4%BB%BD%E4%BB%BB%E5%8B%99%E5%87%BA%E7%8F%BE%E7%B6%B2%E8%B7%AF%E5%95%8F%E9%A1%8C%EF%BC%8C%E7%84%A1%E6%B3%95%E5%9C%A8%20debian%20%E4%B8%8A%E9%87%8D%E6%96%B0%E9%80%A3%E6%8E%A5.png)
我的 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 的 root,所以我可以檢查任何日誌,但我不知道在哪裡查看(以及我搜尋的內容)。
答案1
在 php 錯誤日誌中搜尋後,我發現了一條通知:
PHP 通知:在yyyy 行/usr/share/php/Net/SSH2.php 的連線過早關閉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)) 仍然為 false,然後 fsockopen 未完成再次。
我將 Net_SFTP 類別設為 null,並在重試期間執行新的 Net_SFTP(),並且我不再遇到此問題(我仍然有無法識別的網路中斷,但現在重試工作)。