PHP Linuxサーバーのインバウンド/アウトバウンド比バランサー

しばらく前に自分の経験から知ったように、無制限の関税を受けるためには、一定の比率の着信および発信トラフィックに耐える必要があるプロバイダーがまだあります。

私の場合、サーバーをモスクワの1つのデータセンターのコロケーションに配置する場合、発信は着信の4倍以上である必要がありました(このようなターンはごめんなさい)。 比率は、1日あたりと月ごとの合計の両方で計算されます。 それらのいずれかの違反は罰金です。



それ自体では、サーバーへのバックアップの定期的な一括アップロードのため、比率は維持されませんでした。 手動(ギグ送信、4ギガダウンロード)-疲れています。







それから、あるサイトで昔々、そのようなバランスをとるshスクリプトの数行に原始的なスクリプトを見たことを思い出しました。 その後、保存しなかった、今見つけることができませんでした。 私は自分で書かなければなりませんでした。 結果は公開されます-誰かが役に立つかもしれません。



スクリプトはUbuntuでのみテストされましたが、他のLinuxでも動作するはずです。



shの原始的なものとは異なり、私のスクリプトは毎日および毎月の相関に耐え、ログを保持し、その検出から慎重に暗号化されます(偽のトラフィックはSSHを介してランダムサイズのファイルを転送することで行われ、スローの間にランダムな長さの間隔が作成されます)。 もう1つの違い(ただしマイナス記号は既に付いています)-無制限のトラフィックを持つ応答ノードが必要です。これに対してキーでssh接続を上げることができます。 ホームチャネルとルーターを使用します。



$インターフェイス、$ログファイル、および$サーバー変数に値を入力します。

$サーバー変数は、実際にはsshコマンドのパラメーターを指定します。

つまり、私の場合、コンソールで「ssh my-host.no-ip.org -p 1022 -i /home/user/.ssh/my-key」を実行することで、応答ノードにパスワードを入力せずに接続します(条件付きデータもちろん)。

このスクリプトは、システムの起動時に(たとえば、/ etc / rc.localから)呼び出すか、サービスとして構成する必要があります。



<?php $interface="eth0"; //    $server="my-host.no-ip.org -p 1022 -i /home/user/.ssh/my-key"; //    $logfile="/usr/local/logs/trafic-balancer.log"; //       ,   logrotate   $curdate=0; function echolog($str) { global $logfile; file_put_contents($logfile, $str, FILE_APPEND); echo($str); } echolog("\n".date('r')." \t\n"); while(true) { $f=@fopen("/proc/net/dev", "r"); $stat=null; while($str=fgets($f)) { if(strpos($str, $interface)!==false) { $stat=$str; break; } } fclose($f); if($stat) { $stat=preg_replace("/\s+/", " ", $stat); $nums=explode(" ", $stat); //       $rx_g=round($nums[2]/1024/1024); $tx_g=round($nums[10]/1024/1024); $delta_g=$rx_g*4-$tx_g; //   if($curdate!=date('j')) //    { if($curdate) echolog("\n".date('r')." \t  $curdate : RX:$rx_d Mb, TX:$tx_d Mb, : $delta_d Mb\n"); $curdate=date('j'); $rx_d=0; $tx_d=0; $rx_s=$rx_g; $tx_s=$tx_g; } $rx_d=$rx_g-$rx_s; $tx_d=$tx_g-$tx_s; $delta_d=$rx_d*4-$tx_d; $delta=max($delta_g, $delta_d); if(($delta>0)&&(date('G')>8)) { if($delta>1000) //   1,     $size=round(rand(1000, min($delta/2, 5000))); //       ,     else $size=round(rand($delta*2, $delta*3)); //          echolog("\n".date('r')." \t:  : $delta_g Mb,  : $delta_d Mb,  $size Mb\n"); passthru("dd if=/dev/zero bs=1M count=$size | ssh $server 'cat > /dev/null'"); } else echolog('.'); } else echolog("\n".date('r')." \t  !\n"); sleep(round(rand(10, 600))); } ?>
      
      






All Articles