リアルタイムのApache Webサーバーリクエストを表示する

サーバーの負荷はWebサーバーの管理の重要な部分です。リクエストトラッキングは、エラーのあるリクエストをすばやく検索し、ウェブマスターの統計情報を取得する前に修正するのに役立ちます。 デフォルトでは、dns内のホストの定義はApache Webサーバー構成ファイルでコメント化されており、これがサイトの内容の理解をさらに複雑にします。 Webサーバーへのすべてのリクエストをリアルタイムで表示するスクリプトを記述することで、これをすべて簡素化することができました。 数百のリクエストを保存し、ロード時間を計算しました。 これは、リソースの撤回に費やされた時間の実際の経過時間の割合です。 サイトの各ページの実行に費やす時間の便利な出力は、弱点の検索に不可欠になっています。 検索エンジンテンプレートのリストを含む小さな配列により、クエリフィードでテンプレートを別の色で強調表示することが可能になりました。



Linuxコンソールを使用して、ログからssh出力を転送することにより、出力が起動されます。 すべての計算はローカルページで行われるため、プラスはサーバーの最小負荷でした。 小さなphpスクリプトは、入力の計算に役立ち、その出力は、/ var / log / apache2 / access.logから取得されます。この出力は、明るいバックライトでログの重要な部分を一度に強調表示します。



残念ながら、条件に適した標準のログレベルが見つかりませんでした。私の場合、リクエストが送信されたホストパラメーターは重要なパラメーターでしたが、完全修飾ホスト名の表示を担当する%Vパラメーターは標準設定にありませんでした。 必要なパラメーターをcommonに追加する必要がありました



LogFormat "%h %V %l %u %t \"%r\" %>s %O %D" common
      
      





このようなテープでボットを確認することが重要です。このタスクは、DNSログにクライアントの名前の出力を設定することで支援されました。 この設定は、構成ファイルではデフォルトでオフになっています。



 HostnameLookups On
      
      





スクリプト自体は小さなphpファイルであり、入力されたすべてのデータを部分的に解析し、さらに出力するために重要な処理を強調します。 次のようになります。 セキュリティ上の理由から、ビデオ内のすべてのローカルホストとアドレスが置き換えられます。 さらに、重要なページを興味深いアドレスのリストに追加すると便利な場合があります。 スクリプトは、クエリフィードでこれらのアドレスを強調表示します。 ビデオでは、2番目のパラメーターは1秒あたりの平均リクエスト数を表示し、3番目は最後の1,000リクエストを考慮してリソースの発行に費やしました。







さて、この出力を表示するスクリプト自体。



 /usr/local/bin/log.php
      
      





 <?php $colors = array( "200"=>"[0;32m", "404"=>"[1;31m", "410"=>"[0;31m", "403"=>"[0;91m", "301"=>"[1;33m", "302"=>"[1;36m", "304"=>"[1;36m", ); #   $bots = array("localhost", "googlebot", "yandex", "spider", "ahrefs", "mail.ru", "bot"); #   ,    $url = ["login", "admin"]; #       require "/home/mpak2/www/idna_convert.class.inc"; $idna = new idna_convert(); $in = fopen('php://stdin', 'r'); $tm = []; $t = microtime(true); $nn = 0; $microtime = microtime(true); while($str = fgets($in)){ if(!$ar = explode(" ", $str)){ print_r("   "); }elseif(!$n = number_format($nt = (100*(count($tm)-1)+($nn%100))/(microtime(true)-$t), 2)){ print_r("    "); }elseif(!($percent = number_format((array_sum(array_column($tm, 'msec'))/1e6)/(microtime(true)-$t)*100, 2)) & false){ print_r("   "); }elseif(!$mtime = $ar[11]/1e6){ print_r("    "); }elseif(!$mtm = (($_tm = number_format($mtime, 3)) > 1 ? "\e[1;31m{$_tm}\e[0m" : $_tm)){ print_r("  "); }elseif(!$uri = urldecode($ar[7])){ mpre("   "); }elseif(!$uri = (array_filter(array_map(function($u) use($uri){ return strpos($uri, $u); }, $url)) ? "\e[1;37m". urldecode($ar[7]). "\e[0m" : urldecode($ar[7]))){ print_r("   "); # }elseif(!$uri = "/-/"){ mpre(" "); }elseif(!$status = (array_key_exists($ar[9], $colors) ? "\e{$colors[$ar[9]]}{$ar[9]}\e[0m" : $ar[9])){ print_r("  "); }elseif(!$host = "\e[1;34m". $idna->decode($ar[1]). "\e[0m"){ print_r("   "); # }elseif(!$host = "-."){ print_r("    "); }elseif(!$bot = ((array_filter(array_map(function($b) use($ar){ return (strpos($ar[0], $b) !== false ? $b : false); }, $bots))) ? "\e[1;35m{$ar[0]}\e[0m" : "\e[1;32m{$ar[0]}\e[0m")){ print_r("  "); }elseif(!$size = number_format($ar[10]/1024, 2). ""){ print_r("   "); }else{// print_r($ar); if(($nn++ % 100) == 0){ array_unshift($tm, ['msec'=>0, 'microtime'=>microtime(true)]); if(count($tm) > 10){ $t = array_pop($tm)['microtime']; } } if(!($nn % 1000) && ($cmd = "echo '". strtr($n, ['.'=>' ']). "' | festival --tts --language russian &")){ passthru($cmd); } $tm[0]['msec'] += $ar[10]; passthru("echo '{$nn} {$n} {$percent}% {$mtm}c {$status} http://{$host}{$uri} ({$bot}) {$size}'"); } };
      
      





コマンドによって開始されます:ssh root@habr-habr.ru php -f /usr/local/bin/log.php



All Articles