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 脚本的负载保持在每秒 2 个请求以下(脚本中有 2 个 SSH 连接,因此每秒有 4 个连接),就可以正常工作

但是当它每秒超过 2 个请求时,连接开始失败,日志中出现以下错误:

[2012 年 4 月 21 日星期六 11:51:40] [错误] [客户端 172.16.57.97] PHP 警告:ssh2_connect():启动 SSH 连接时出错(-1):在 /var/www/fsproj/result 中获取横幅失败。 php 在第 105 行
[Sat Apr 21 11:51:40 2012] [error] [client 172.16.57.97] PHP Warning: ssh2_connect(): Unable to connect to localhost in /var/www/fsproj/result.php on line 105

我使用以下代码尝试解决问题,但如果持续负载大于 2req/sec。它只是最终增加了响应时间

$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

老实说,我会使用phpseclib,一个纯 PHP SSH 实现

<?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 回答