nginxで同一ユーザからの過度なアクセスを制限する。インフラブログスマートフォン用の表示で見るインフラブログとあるWEBサイトのインフラを構築運用するメモこの広告は、90日以上更新していないブログに表示しています。2014-01-27nginxで同一ユーザからの過度なアクセスを制限する。今回運用するWEBサイトではユーザがほぼ同タイミングでPOSTのボタンを数回連打したり、もしくはツールなどを使って一定期間同じリクエストを延々と飛ばしてきたりする可能性が普通にあるらしく、ある程度の規制はいれておきたいと思います。nginxで使えそうなものがないか色々と調べてみるとここで紹介されているlimit_req_zoneが使えそうです。下記のように、httpディレクティブで何をキーにしてアクセス数をどの程度で制限するかを定義して、serverのlocation内でどの制限を適用するかを指定します。499,burstを超えた場合は503として扱い、専用のソーリーページを返すようにします。クライアント側IPをキーにして1秒間に1回までのアクセス上限とする。メモリ10Mを使用してoneという名前でセッション管理する。/searchには1秒に1リクエストまでの接続が許可される。1以上のリクエストが来た場合でも5リクエストまでは503エラーとせずに1r/sの割合でリクエストを処理していく。}opensocial_viewer_idをキーにするクライアント側のIP($binary_remote_addr)をキーにしてアクセスをカウントする例が多いのですが、オープンソーシャルなWEBサイトということもあり、プラットフォームのサーバのIPがクライアントIPになっていたり、携帯端末からアクセスしてきた場合は各キャリアが持つプロキシサーバのIPだったりするので、$binary_remote_addrでユーザを特定できません。今回の案件ではそのまんまopensocial_viewer_idでユーザを区別することにします。rate=1r/s;という感じで指定できるのですが、アプリの作りのほうで「そんなパラメータを毎回URLに付けません」ということになっているので、また一工夫必要です。このRailsアプリではセッション管理にRedisを使用することになっているのですが、このセッションの中にopensocial_viewer_idが保存されていましたので、nginxからこのopensocial_viewer_idを参照することにします。参照する際にセッションキーが必要ですが、これはcookie内の_session_idから取得可能です。設定抜粋すると下記のようになります。セッション内容からopensocial_viewer_id部分を抽出して$opensocial_viewer_idに設定する。...}キーが空の場合は設定した後で気づいたのですが、はじめてサイトに来た場合はsessionが作られてないのでsessionからopensocial_viewer_idを参照できません(空扱い)。最初に来た人達に対して「キーが空」としてアクセス制限のテーブルを参照してしまうとすぐにアクセス超過となってしまいます。空の場合の処理を調べてみたところ、キーが空の場合はアクセス制限処理がスルーされるようなので、とりあえず問題は起きなさそうです。22:43nginxで同一ユーザからの過度なアクセスを制限する。Balancing)作成インターネットからのHTTPリクエストを受けるproxyサーバとRail...2014-01-30メール以外の方法でもアラートの通知を行う(Twilio)アラート通知の続きです。Services)Rubyはてなブログをはじめよう!ls-laさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。