2024.11.14
いまさらNode.jsを知ろう~環境構築も~
2014.08.01
インフラluaでつくる連続アクセス拒否er(nginx用)
こんにちは、TMです。
前にとある案件でつくったものの、要件と違っていてお蔵入りになったscriptをさらします。
NginX用です。
access_by_lua ' -- 単位時間を設定 request_time = os.time() ok_time = request_date - 60 -- リクエスト回数閾値 shikii = 10 -- 接続を拒否する際にリダイレクトするURL sorry_url = "http://www.tcmobile.jp/" -- memcacheのキー key = ngx.var.remote_addr .. ngx.var.http_user_agent -- proxy経由用memcacheのキー -- key = ngx.var.http_x_forwarded_for .. ngx.var.http_user_agent -- memcache接続 local memcached = require "resty.memcached" local client, err = memcached:new() if not client then ngx.say("failed to instantiate client: ", err) return end client:set_timeout(1000) local ok, err = memc:connect("127.0.0.1", 11211) if not ok then ngx.say("failed to connect: ", err) return end -- 1.接続元IP Address+UserAgent+「_1」からKVSから値を取得する local res, flags, err = client:get(key .. "_1") if err then ngx.say("failed to get _1: ", err) return end -- 2.値が取得できたかを判定する if not res then -- 2-1.値取得できなかった場合 local ok, err = set_init(request_time) if not ok then ngx.say("failed to set: ", err) return end -- 2-2.値が取得できた場合 else if res < ok_time then -- 2-2-1.閾値時間が経過している場合 local ok, err = set_init(request_time) if not ok then ngx.say("failed to set: ", err) return end else -- 2-2-2.閾値時間が経過していない場合 -- 2-2-2-1.接続元IP Address+UserAgent+「_2」からKVSから値を取得し、閾値回数を超えているか判断する。 local res, flags, err = client:get(key .. "_2") if err then ngx.say("failed to get _1: ", err) return end if res > shikii then -- 2-2-2-1-1.値が閾値回数を超えている場合 return ngx.redirect(sorry_url) else -- 2-2-2-1-2.値が閾値回数を超えていない場合 newv, err = memc:incr(key .. "_2", 1) if not ok then ngx.say("failed to incr: ", err) return end end end end return function set_init (key, request_time) local ok, err = memc:set(key .. "_1", request_time) if not ok then return false, err end local ok, err = memc:set(key .. "_2", 1) if not ok then return false, err end retuen true end ';
こんな感じ。
【記事への感想募集中!】
記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!【テクノデジタルではエンジニア/デザイナーを積極採用中です!】
下記項目に1つでも当てはまる方は是非、詳細ページへ!Qangaroo(カンガルー)
【テクノデジタルのインフラサービス】
当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
タグ検索