![SFTPバックアップタスクでネットワークの問題が発生し、Debianで再接続できない](https://rvso.com/image/1641919/SFTP%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%A7%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E5%95%8F%E9%A1%8C%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%80%81Debian%E3%81%A7%E5%86%8D%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84.png)
私の Debian サーバー上の PHP のスケジュールされたタスクに問題があります。毎晩、サーバー S1 からサーバー S2 にデータのバックアップを送信しています。2 つのサーバーは専用サーバーですが、同じ場所にホストされていません。
バックアップは、phpseclib から Net_SFTP で送信される複数のファイル (300 MB から 5 GB) で構成され、ネットワーク接続で多くのリソースを消費しないように、0 時間から 4 時間の間の複数のスケジュール タイマーが設定されます。
そして毎晩、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)) テストが依然として false であり、fsockopen が再度実行されないことがわかりました。
Net_SFTP クラスを null に設定し、再試行中に新しい Net_SFTP() を実行すると、この問題は発生しなくなりました (識別できないネットワーク切断はまだありますが、再試行は機能するようになりました)。