2025.08.29
Laravelで空判定にif文を使うとハマる理由
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などへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
1
2025.08.29
Laravelで空判定にif文を使うとハマる理由
2

2025.08.29
Git SSH接続でfetch/pullができなくなった時の対処法
3

2025.08.28
【体験談】Amazon Linux 2でMySQLインストール時のOpenSSL・GPG key エラーにハマった話
4
2025.08.28
【AWS】SSMポートフォワーディングとInstance Connectを利用したプライベートEC2へのSSH接続手順
5
2025.07.24
Log::info()が使えない!?Laravel.logのPermission denied エラーを解決する(Docker環境)
タグ検索