Apache の共有環境で仮想ホストの帯域幅請求を処理するために、どのようなソリューションを用意していますか? ログ解析を使用している場合、ログが非常に大きくなったときにソリューションは適切にスケーリングされますか? このために何らかのモジュールを使用している人はいますか?
6 に答える
仮想ホストに独自のIPがない場合、ログファイルの解析よりも簡単な方法はありません。mod_logioを使用して、転送された実際のバイト数を計算するだけです。mod_logioは、切断された接続、圧縮データなどを正しく処理します。パイプログを使用して、ログをリアルタイムで解析できるはずです。BufferedLogsを使用してさらにスケーリングします(正しくバッファリングされたときにパーサーが壊れた行を処理することを確認してください)。パーサーはデータを定期的に(毎分など)どこかに保存する必要があります。解析によってhttpdの速度が低下してはならないため、ロックの問題は避けてください。httpd接続がサーバーステータスのL状態で時間を費やしている場合は、速度が遅すぎます。数値を取得したら、合計してさらにデータを課金システムに保存できます。
請求ログをファイルとして保存する場合も、リアルタイムのトラフィック計算を修正して再確認できます。httpdを起動すると、いくつかの行が失われる可能性があります。ただし、大量のサイトでは数秒未満の価値があるため、通常、数百のリクエストを失うことは許容されます。
mod_cbandやmod_bwのように、帯域幅を処理および制限しようとするモジュールがあります。ただし、複数のマシンに同じ仮想ホストがある場合は機能しません。小規模でも問題なく動作すると思います。
vhostごとにIPがある場合は、ファイアウォールログをトラフィック計算機にフィードするなどのIPベースの方法を試すことができます。簡単な方法はiptablesを使用することです。
転送量の最大値を設定できる Apache 1.x および 2.x 用の特定のモジュールが存在します。それらのほとんどは、Apache が生成するスコアボード ファイルを使用して追跡します (mod_status が ExtendedStatus で有効になっている場合)。探していたときにまだブックマークしたものはmod_curbですが、完全ではなく、現時点ではサーバー全体の規模でのみ機能し、個々の仮想ホストでは機能しないようです.
Apache モジュールはアウトバウンド フィルターとして設定できるため、チェーンの最後に位置するコスチューム モジュールを記述し、APR が提供するデータを使用してすべての発信パケットを合計し、それをカウンターに追加できます。その特定のドメイン/サブドメイン。その後、データをどうするかを選択できます。
特定の例については、Apache が提供する mod_deflate を見て、チェーンの最後に位置し、サーバーが送信するヘッダー以外のすべてを圧縮する方法を確認してください。これで良いスタートが切れるはずです。
ログベースの処理に関しては、ログが多いほど遅くなります。これはまさに獣の性質です。ログベースのソリューションを使用していたとき、15 分ごとに実行されるカスタム perl スクリプトがありました。最終的には解析に 15 分以上かかることになり、しばらくして適切にロックしたため、これらのログ処理 Perl スクリプトが複数実行され、すべてが相互に待機していました。最後に、単純な tail -F の呼び出しで書き直しました。これにより、perl は受信したすべてのリクエストを解析できるようになりました。完全に効率的ではありませんが、機能しました。その利点は、ほぼリアルタイムでトラフィック統計を更新できるようになったことです。これにより、クライアントが制限を超えた場合に、遅かれ早かれ更新されることはなくなりました。
貧乏人の道を行くことができ、Webalizer または Awstats を使用できます。これらは両方とも、アクセス ログに基づいてトラフィックのアイデアを提供し、仮想ホストごとに実行できます。Awstats の場合、毎日 10 GB 以上のトラフィックを処理し始めると、リソースを消費し始めます。いつでもナイスにできますが、そうすると、実際にデータが必要になったときではなく、来週データを取得することになります。過去に Webalizer を使用していたときは、ハッカーを使用して大きなアクセス ログを処理できるようにする必要がありました。これは、ログを管理できる小さな断片に分割することによって行われました。私が行ったことから多くの有用なメトリックを提供しませんでしたが、サーバーを保存する必要もありませんでした:)
mod_cbandを使用している場合を除いて、mod_cbandは素晴らしいでしょう。ただし、max_connections(すべてのクライアントを合わせた全体の合計値)は、設定した最大値に達するまで上向きにクロールすることを決定します。最高値に達すると、そこにとどまり、すべてのクライアントに「503ServiceTemporarilyUnavailable」エラーが常に発生します。
たとえば、「CbandSpeed 1000Mbps 500 1200」を設定すると、サーバー接続は約8時間で最大1200までクロールし、そこにとどまります。この時点で、mod_cbandステータスウィンドウのリモートクライアントの下にある接続の総数を数えます。約50が表示されます。psauxも使用しており、ほぼ同じ量(〜50)のオープンhttpプロセスが表示されます。 503エラーのために誰もサイトにアクセスできないという事実を除いて、通常です。
何が間違っている可能性があるのか、またはこれを修正できるのでしょうか?
Apache ではなく IIS を使用していますが、帯域幅の請求 (および帯域幅のプロファイリング / 分析) にはログ ファイル分析を使用しています。カスタム アプリケーションを使用して、ログ ファイルに収集されたデータを 1 時間単位で読み込み、必要な通知や帯域幅の過剰使用に対応します。
ログ ファイル ローダーは、サーバーの動作を中断しないように、優先度の低いプロセスとして実行されます。多数のサイトを持つ使用率の高いサーバーでも、処理にかかる時間は 15 分未満であるため、この方法論ではスケーラビリティが問題になるとは考えていません。
これを行うためのより良い方法があるかもしれませんが、これは私たちが必要とするものには完全に適しています. 他の回答を見るのが楽しみです。
mod_cband で簡単に実現できます。モジュールを書き直して、いくつかのバグを修正し、再起動時に真の冗長性を提供し、FTP とメールの統計を組み込みました。
http://www.howtoforge.com/mod_cband_apache2_bandwidth_quota_throttling