Rumah >pangkalan data >Redis >Cara menggunakan lua untuk kawalan akses nginx redis
1. Terdapat banyak cara untuk Nginx mengendalikan kawalan akses, dan terdapat banyak kesan pelaksanaan, akses Sekatan kandungan, sekatan kekerapan akses, dsb.
2. Menggunakan Nginx+Lua+Redis untuk sekatan akses terutamanya mengambil kira keperluan untuk kawalan akses pantas dalam persekitaran konkurensi tinggi.
3. Proses permintaan pemprosesan Nginx dibahagikan kepada 11 peringkat, iaitu:
post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files、content、log.
Dalam openresty, anda boleh menemui:
set_by_lua,access_by_lua,content_by_lua,rewrite_by_lua等方法。
Kemudian kawalan akses haruslah , peringkat akses.
Mengikut pemikiran logik biasa, penyelesaian kawalan akses yang kami fikirkan adalah seperti berikut:
1. =》Ya, sama ada dilarang telah tamat tempoh: Ya, kosongkan rekod, kembalikan 200, akses biasa Tidak, kembalikan 403, kembalikan 200, akses biasa
2 Pemprosesan +1 kekerapan
3. Semak sama ada kekerapan akses melebihi had Jika melebihi had, rekod terlarang akan ditambah dan 403 akan dikembalikan
Ini adalah penyelesaian yang mudah . Anda juga boleh menambah butiran dan masa larangan akses Diimport melalui algoritma, lengkung cekung meningkat setiap kali.
Mula-mula tambahkan fail konfigurasi vhost untuk nginx Bahagian vhost.conf adalah seperti berikut:
lua_package_path "/usr/local/openresty/lualib/?.lua;;";#告诉openresty库地址lua_package_cpath "/usr/local/openresty/lualib/?.so;;"; error_log /usr/local/openresty/nginx/logs/openresty.debug.log debug; server { listen 8080 default; server_name www.ttlsa.com; root /www/openresty; location /login { default_type 'text/html'; access_by_lua_file "/usr/local/openresty/nginx/lua/access_by_redis.lua";#通过lua来处理访问控制 } }
Access_by_redis.lua
Selepas merujuk kepada pelaksanaan v2ex.com, kami mendapati bahawa menggunakan penyelesaian storan rentetan ringkas sudah memadai, jadi kami memilih redis sebagai kaedah penyimpanan. Kuncinya ialah: Rekod log masuk pengguna: pengguna:127.0.0.1:masa (cap waktu unix) Sekatan akses: blok:127.0.0.1Sambung ke Redis dahulu :local red = redis:new()function M:redis() red:set_timeout(1000)local ok, err = red:connect("127.0.0.1", 6379)if not ok then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end endMengikut pelan logik kami, langkah kedua adalah untuk mengesan sama ada ia adalah dilarang. Seterusnya kami akan mengesan blok:127.0.0.1 Jika data dicari, semak sama ada masanya telah tamat tidak tamat tempoh, kembalikan 403, jika tidak terus Kembali 200:
function M:check1()local time=os.time() --system timelocal res, err = red:get("block:"..ngx.var.remote_addr)if not res then -- redis error ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) --redis get data error endif type(res) == "string" then --if red not null then type(red)==string if tonumber(res) >= tonumber(time) then --check if forbidden expired ngx.exit(ngx.HTTP_FORBIDDEN) --ngx.say("forbidden") end end }Seterusnya, ia akan menyemak sama ada kekerapan akses terlalu tinggi, ia akan disenarai hitamkan kaedah adalah untuk mengesan pengguna:127.0.0.1 Sama ada nilai :masa melebihi standard:
function M:check2()local time=os.time() --system timelocal res, err = red:get("user:"..ngx.var.remote_addr..":"..time)if not res then -- redis error ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) --redis get data error endif type(res) == "string" then if tonumber(res) >= 10 then -- attack, 10 times request/s red:del("block:"..self.ip) red:set("block:"..self.ip, tonumber(time)+5*60 ) --set block time ngx.exit(ngx.HTTP_FORBIDDEN) end end endAkhir sekali, ingat untuk membuat kenaikan automatik untuk setiap masa akses, pengguna:127.0.0.1:masa:
function M:add()local time=os.time() --system time ok, err = red:incr("user:"..ngx.var.remote_addr..":"..time)if not ok then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) --redis get data error end endKemudian, uji, saya meleret penyemak imbas beberapa kali dan mendapati bahawa selepas beberapa ketika, 403 dikembalikan OK, selesai.
Atas ialah kandungan terperinci Cara menggunakan lua untuk kawalan akses nginx redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!