Rumah > pangkalan data > Redis > teks badan

Cara menggunakan lua untuk kawalan akses nginx redis

王林
Lepaskan: 2023-06-02 16:31:15
ke hadapan
921 orang telah melayarinya

怎么使用lua进行nginx redis访问控制

1. Analisis keperluan

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.
Salin selepas log masuk

Dalam openresty, anda boleh menemui:

set_by_lua,access_by_lua,content_by_lua,rewrite_by_lua等方法。
Salin selepas log masuk

Kemudian kawalan akses haruslah , peringkat akses.

Penyelesaian

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.

Kaedah pelaksanaan

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来处理访问控制   }
}
Salin selepas log masuk

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.1

Sambung 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
end
Salin selepas log masuk

Mengikut 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
}
Salin selepas log masuk

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
end
Salin selepas log masuk

Akhir 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
end
Salin selepas log masuk
Kemudian, 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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan