nginx+luaインタフェースアクセス回数を制限する


https://blog.csdn.net/wyfhist/article/details/78333671
nginx+lua制限インタフェースアクセス回数2017-10-24 19:54:32三月ソフトウェア----王耀峰阅读数4265更多分类コラム:nginx lua著作権声明:本文はブロガーオリジナル文章で、CC 4.0 BY-SA著作権协议に従い、転載は原文出典リンクと本声明を添付してください.このリンクは次のとおりです.https://blog.csdn.net/wyfhist/article/details/78333671最近nginx+luaのものをいくつか見て、ストリーム制限スクリプトを実現しようとしましたが、最も根本的な機能しか含まれていません.
コードは次のとおりです.
access_nginx_check.lua-url+パラメータに従って一定時間以内にアクセス回数制限を行うluaスクリプト.ここではurl 10 s内で2回のアクセス制限を実現し、毎回のアクセス回数を記録する(コードロジックをチェックするために削除できるだけではない)、パラメータ関数を取得するにはすでにあり、後で改善する必要がある.
--package.path = package.path ..';..\?.lua';--dofile("./log.lua")--検出local check="on"--最大アクセス制限local count=2--制限時間範囲local seconds=10--パラメータの値function getParam()if"GET"=request_method thenargs = ngx.req.get_uri_args()elseif "POST"== request_method thenngx.req.read_body()args = ngx.req.get_post_args()endreturn argsend-書き込みログfunction writerLog(str)local time=os.time()local date = os.date("%Y%m%d",time)
local file = io.open("/var/www/lua/logTest/"..tostring(date).."_log.log","a")
--ngx.say("/var/www/lua/log/"..tostring(date).."_log.log")
--assert(file)
file:write(str.."
") file:close();

end--uriを制限するプライマリロジックfunction access_user_uri_check()-- bodyif check=="on"thenlocal access_uri = ngx.var.host..ngx.var.uri-local param=getParam()local key=accessuri-nginxで事前に宣言した変数local limit=ngx.shared.limitlocal req if limit thenreq,=limit:get(key)endif req thenif req>=count then--制限を超えた後にエラーngxを返す.say(「最近:」..seconds.「秒、アクセス:」..access_uri.「回数超過:」..cont.「次、保護メカニズムがトリガーされました.後でアクセスしてください」)ngx.exit(403)end--keyに対応するデータを累積limit:incr(key,1)
    else

--値が最初に1 limit:set(key,1,seconds)endに設定されていません--logwriterLog(key..":.......limit:get(key))を記録します.
end

end--エラーデバッグ関数function myerrorhandler(err)ngx.say(「ERROR:」,err)end--テストコード、status=xpcall(access_user_uri_check,myerrorhandler)--access_user_uri_check()
対応nginx構成#宣言変数はluaスクリプトのngxに対応する.shared.limitlua_shared_dict limit 10m;server{listen 80;server_name localhost.accesslua.com;root/var/www/html/test;charset utf-8;location~.php{#luaスクリプトをデバッグするためにブラウザに直接情報を投げ出す.そうしないとdefault_type'text/html';#埋め込まれたluaスクリプトaccess_by_lua_file'/var/www/lua/access_nginx_check.lua"が自動的にダウンロードされる;#phpの通常呼び出しfastcgi_pass 192.168.33.11:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}#ログアクセスlog/usr/local/var/log/lua.accesslua-php5.access.log main;
}
プレゼンテーション効果