2
$con = ssh2_connect($host, 22);
ssh2_auth_password($con, $rem_acc, $pass);
ssh2_scp_send($con,$rand.".gz","./".$rand.".gz");
$stream = ssh2_exec($con, "./exeonserv.sh ".$rand);

PHPスクリプトへの負荷を1秒あたり2リクエスト未満に保つ限り(スクリプトには2つのSSH接続があるため、1秒あたり4接続)、これは正常に機能します。

ただし、1秒あたり2リクエストを超えると、接続が失敗し始め、ログに次のエラーが記録されます。

[2012年4月21日土曜日11:51:40][エラー][クライアント172.16.57.97]PHP警告:ssh2_connect():SSH接続の起動中にエラーが発生しました(-1):/ var / www / fsproj/resultでバナーを取得できませんでした。 105行目のphp
[2012年4月21日土曜日11:51:40][エラー][クライアント172.16.57.97]PHP警告:ssh2_connect():105行目の/var/www/fsproj/result.phpのローカルホストに接続できません

次のコードを使用して問題を解決しようとしましたが、持続的な負荷が2req/秒を超える場合。応答時間が長くなるだけです

$con=false;    
while(!$con)
{
    $con = ssh2_connect($host, 22);
}

SSH接続を開くことができる最大レートに上限はありますか?もしそうなら、どこでその値を変更できますか?(または他の解決策?)

UbuntuでApacheを使用しています

4

2 に答える 2

3

を見てみるとman sshd_config、次のセクションでは、一度に開くことができるSSH接続の最大数と、同時接続の最大試行回数を制御しているようです。希望の設定で変更する必要があり/etc/ssh/sshd_configます。

     MaxSessions
             Specifies the maximum number of open sessions permitted per net-
             work connection.  The default is 10.

     MaxStartups
             Specifies the maximum number of concurrent unauthenticated con-
             nections to the SSH daemon.  Additional connections will be
             dropped until authentication succeeds or the LoginGraceTime
             expires for a connection.  The default is 10.

             Alternatively, random early drop can be enabled by specifying the
             three colon separated values ``start:rate:full'' (e.g.
             "10:30:60").  sshd(8) will refuse connection attempts with a
             probability of ``rate/100'' (30%) if there are currently
             ``start'' (10) unauthenticated connections.  The probability
             increases linearly and all connection attempts are refused if the
             number of unauthenticated connections reaches ``full'' (60).

さらに、サーバーに接続しようとしている例では、sleep接続の試行が失敗した後に追加することをお勧めします。このバックオフがなく、サーバーがフラッディングされると、接続の試行でサーバーをさらにフラッディングしようとするため、スクリプトによって状況が悪化する可能性があります。

于 2012-04-21T07:44:26.213 に答える
1

正直なところ、純粋なPHPSSH実装であるphpseclibを使用します。

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>

phpseclibはlibssh2よりも移植性が高く、問題の診断に役立つ可能性のあるphpseclibを使用してログを取得できます。

于 2012-04-24T06:11:29.143 に答える