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 end
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 }
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
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
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!