「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。先日、ApacheやnginxといったWebサーバにおいてDoS的アクセスを検知して任意の制御を行うhttp-dos-detectorを公開しました。hb.matsumoto-r.jp上記の拡張も非常に便利なのですが、もう少しシンプルに、現在のサーバに対するリクエスト状況においてとある属性、例えば、どのファイルにどれだけアクセスが発生しているかを計測したい場合があります。これまでは、そういった情報をApacheのスコアボードの範囲内で情報を得たりしてきました。Webサービスの高度化に伴い、もう少し柔軟にアクセス状況を計測し、その計測を元に任意の制御をプログラマブルに行いたい場合があると思います。そこで、それを実現するための拡張を、mod_mrubyとngx_mrubyを利用して実装しました。Apacheとnginx両方で動きますし、mrubyの実装コードも同じになっていますので、両方のサーバですぐに同等の処理を使う事ができます。この拡張をhttp-access-limitterと名づけました。github.comh2o_mrubyも実装が進めば、この辺の処理も行えるようになると想像しております。http-access-limitterの使用例ということで、簡単な使い方は上記リポジトリのREADMEを見ていただくとして、基本的にはそれぞれのWebサーバのアクセスチェックのタイミングで任意の属性、例えば以下の例ではリクエストファイルのカウンタをインクリメントし、ログ出力のタイミングでカウンタをデクリメントすることができます。公開しているコードでは、とあるファイルに対する同時アクセス数が2以上になったら503を返すような処理を書いており、以下のようになります。endendまた、limit.currentによって現在のカウンタの値を取得し、その後に行う処理は上記例のように503を返すだけではなく、mrubyで何かAPIをつつくとか、mod_mrubyとかngx_mrubyの機能により別のプロキシにリダイレクトするとか、何かリクエストの属性をまとめたログをどこかに吐くとか、様々な制御を行う事ができます。file,}このカウンターのターゲットをリクエスト処理における別の属性、例えばファイルのパーミッションだったり、アクセス元IPであったり、認証のユーザ名だったり様々な属性を使う事ができます。これによって、任意の属性に対する同時アクセス状況を計測可能となり、それに基づいた任意の制御が実行可能になります。これらについても、mruby及びmod_mrubyやngx_mrubyで取得・加工可能なターゲットであれば何でも良いです。AccessLimitter.newなインスタンスを複数生成すれば、2段階の条件だったり、複数条件の組み合わせももちろん可能となります。やりたい事が色々できそうですね。まとめということで、http-dos-detectorのよりももう少しシンプルでありながら、使い方によっては様々なな応用が可能なhttp-access-limitterを実装・紹介しました。これと、http-dos-detectorを使えば、アクセス状況や同時接続状況などさまざまな状況において適切な制御を実装することができると思うので、是非色々試してみたください。はてなブログPro研究者と技術者をやっています。詳しくはリンクの「研究・開発業績ページ」を御覧ください。さくらインターネットに入社して1年が経ちました非厳密計算で確率的に解釈するコンピューティングへの流れラストオーサーとしての国際会議投稿やジャーナル執筆のサポートについてviを:wqや:q!、あるいはZZで終了するのとではどちらが効率的か自分の研究開発に自信を持つためには月別アーカイブリンク研究・開発業績ページ旧ブログ検索はてなブログをはじめよう!matsumoto_rさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。