私は長い間、Apacheのパッチを使用してきました。これは、要求行を解析した後、IPプログラム名、要求の発信元、Hostヘッダーにあるもの、要求行自体に書き込みます。 しかし、この2行のパッチは12年前にApacheバージョン1.3用に作成されました。 そして、手は届きませんでした。 さらに、その時点から、Apacheの新しいバージョン用に、これらの目的のために多くの(5分で少なくとも2つ見つけた)モジュールがありました。 しかし、時間が経つにつれて、単純に文字列を照会するだけでは不十分になりました。 そして...私は自分のモジュールを書きました。
ドクター、そのような写真はどこで手に入れたの?
最初は、Apacheの開発者用ドキュメントの不足に苦しみました。 ソースコード全体を読み直して、必要なフックを探す必要がありました。 すでに10番目のモジュールを書いているときは問題ありませんが、最初のモジュールと最後のモジュールが問題になる場合があります。
20リクエストごとまたは1秒ごとにapacheルートプロセスから呼び出されるap_hook_monitor()フックを見つけることができたとき、文字列にできるだけ多くのクールな統計情報をプッシュすることを切望しました。 あらゆる種類のステータス、数量、10秒、1分、5分、稼働時間での読み込みを試しました...しかし、結果を見ると、この見掛け倒しが干渉するだけで、1秒あたりのビットレートとリクエストのみが残っていることがわかりました。
モジュールの最も重要な新機能は、完全および不完全な待機キューの長さです。 これは、BackLogをいくつかの場所でhttpd.confに書き込むときです。サーバーが受け入れる時間がないというリクエストは、このキューに蓄積されます。 そして、キューがいっぱいになると、それらは破棄され始めます。 通常、これはたとえばhabraeffectで、またはサイトがサードパーティのリソースにアクセスし、サイトが「嘘をついている」またはブロックされている場合(たとえば、最近のgithub)に発生します。 そして、ここではリッスンキューの数字とqps数字が目にとても役立ちます。
これらのLinuxのすべてがいかに悪いか
突然、小さな犠牲者のいるモジュールはFreeBSDでしか書けないことが判明しました。 プログラムの名前を変更するにはsetproctitle()関数があり、SO_LISTENQLENおよびSO_LISTENINCQLENパラメーターを指定したgetsockopt()呼び出しを使用して、完全および未完了の待機キューの長さを確認できます。
Linuxの場合、すべてがより複雑です。 実行可能ファイルの名前を取得し、常に個別に追加する必要があります(FreeBSDはこれを自動的に行います)。 これは、rcスクリプトの大部分がpsで光る名前を使用して起動/再起動することを覚えておくために必要です。
Linuxの場合、難しいことがわかり、Listen Queueの値を見つけることができます。 これまでのところ、netlinkを使用するためのオプションがあります(7)。 しかし、詳細はずれています。
注ぎ込む
FreeBSD + Apache 2.4の場合、モジュールは完全に機能します。 他のバージョンのApacheで試すことができます。 Linuxへの移植を支援することは可能であり、必要です。
モジュールはソースコードで配布されており、あなたはそれを使って何でもできます:
github.com/schors/mod_proctitle
PS Nekstati、私はどこかでUDPの統計の定期的なリセットの機能でそれを補完したいと思います。 もう少し完成。