Comment utiliser Lua pour le contrôle d'accès Nginx Redis
1. Analyse des exigences
1. Nginx dispose de nombreuses façons de gérer le contrôle d'accès, et il existe de nombreux effets de mise en œuvre, tels que la plage IP d'accès, les restrictions de contenu d'accès, les restrictions de fréquence d'accès, etc.
2. L'utilisation de Nginx+Lua+Redis pour la restriction d'accès prend principalement en compte la nécessité d'un contrôle d'accès rapide dans les environnements à forte concurrence.
3. Le processus de traitement des requêtes Nginx est divisé en 11 étapes, qui sont :
post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files、content、log.
Dans openresty, vous pouvez trouver :
set_by_lua,access_by_lua,content_by_lua,rewrite_by_lua等方法。
Ensuite, le contrôle d'accès devrait être l'étape d'accès.
Solution
Selon la pensée logique normale, la solution de contrôle d'accès à laquelle nous penserions est la suivante :
1. Détecter si c'est interdit ? =》Oui, si l'interdiction a expiré : Oui, effacer l'enregistrement, renvoyer 200, accès normal ; Non, renvoyer 403 =》Non, renvoyer 200, accès normal
2. 1 traitement
3. Vérifiez si la fréquence d'accès dépasse la limite. Si elle dépasse la limite, un enregistrement interdit sera ajouté et 403 sera renvoyé
C'est une solution simple. le temps d'interdiction d'accès est importé via l'algorithme et la courbe concave augmente à chaque fois.
Méthode d'implémentation
Ajoutez d'abord le fichier de configuration vhost pour nginx. La partie vhost.conf est la suivante :
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
Après avoir fait référence à l'implémentation de v2ex.com, nous avons constaté qu'en utilisant un simple La solution de stockage de chaînes est suffisante. C'était suffisant, c'est pourquoi Redis a été choisi comme méthode de stockage. Les clés sont :
Enregistrement de connexion utilisateur : utilisateur :127.0.0.1 :heure (horodatage unix)
Restrictions d'accès : bloc :127.0.0.1
Connectez-vous d'abord à Redis :
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
Selon notre plan logique, deuxièmement Le premier L'étape consiste à vérifier si c'est interdit. Ensuite, nous vérifierons le bloc : 127.0.0.1. Si les données sont recherchées, vérifiez si le délai n'a pas expiré, 403 sera renvoyé directement. :
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 }
Ensuite, nous vérifierons si la fréquence d'accès a été dépassée. Si elle est trop élevée, elle sera mise sur liste noire. La façon d'y parvenir est de détecter si la valeur de user:127.0.0.1:time dépasse. le 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
Enfin, pensez à prévoir un temps pour chaque visite Auto-augmentation, user:127.0.0.1:time:
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
Ensuite, testez, forcez le rafraîchissement du navigateur plusieurs fois, et constatez qu'au bout d'un moment, 403 est renvoyé, ok, c'est fait.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



1. Démarrez le menu [Démarrer], entrez [cmd], cliquez avec le bouton droit sur [Invite de commandes] et sélectionnez Exécuter en tant qu'[Administrateur]. 2. Entrez les commandes suivantes dans l'ordre (copiez et collez soigneusement) : SCconfigwuauservstart=auto, appuyez sur Entrée SCconfigbitsstart=auto, appuyez sur Entrée SCconfigcryptsvcstart=auto, appuyez sur Entrée SCconfigtrustedinstallerstart=auto, appuyez sur Entrée SCconfigwuauservtype=share, appuyez sur Entrée netstopwuauserv , appuyez sur Entrée netstopcryptS.

Dans le développement PHP, le mécanisme de mise en cache améliore les performances en stockant temporairement les données fréquemment consultées en mémoire ou sur disque, réduisant ainsi le nombre d'accès à la base de données. Les types de cache incluent principalement le cache de mémoire, de fichiers et de bases de données. En PHP, vous pouvez utiliser des fonctions intégrées ou des bibliothèques tierces pour implémenter la mise en cache, telles que cache_get() et Memcache. Les applications pratiques courantes incluent la mise en cache des résultats des requêtes de base de données pour optimiser les performances des requêtes et la mise en cache de la sortie des pages pour accélérer le rendu. Le mécanisme de mise en cache améliore efficacement la vitesse de réponse du site Web, améliore l'expérience utilisateur et réduit la charge du serveur.

Vous devez d’abord définir la langue du système sur l’affichage chinois simplifié et redémarrer. Bien sûr, si vous avez déjà modifié la langue d'affichage en chinois simplifié, vous pouvez simplement ignorer cette étape. Ensuite, commencez à utiliser le registre, regedit.exe, accédez directement à HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsLanguage dans la barre de navigation de gauche ou dans la barre d'adresse supérieure, puis modifiez la valeur de la clé InstallLanguage et la valeur de la clé par défaut sur 0804 (si vous souhaitez la changer en anglais en- nous, vous devez d'abord définir la langue d'affichage du système sur en-us, redémarrer le système, puis tout changer en 0409). Vous devez redémarrer le système à ce stade.

1. Tout d'abord, double-cliquez sur l'icône [Ce PC] sur le bureau pour l'ouvrir. 2. Double-cliquez ensuite sur le bouton gauche de la souris pour accéder à [Lecteur C]. Les fichiers système seront généralement automatiquement stockés dans le lecteur C. 3. Recherchez ensuite le dossier [windows] dans le lecteur C et double-cliquez pour entrer. 4. Après avoir accédé au dossier [windows], recherchez le dossier [SoftwareDistribution]. 5. Après avoir entré, recherchez le dossier [télécharger], qui contient tous les fichiers de téléchargement et de mise à jour Win11. 6. Si nous souhaitons supprimer ces fichiers, supprimez-les simplement directement dans ce dossier.

Causes et solutions pour les erreurs Lors de l'utilisation de PECL pour installer des extensions dans un environnement Docker Lorsque nous utilisons un environnement Docker, nous rencontrons souvent des maux de tête ...

L'accès au fichier du site WordPress est restreint: dépannage de la raison pour laquelle le fichier .txt ne peut pas être accessible récemment. Certains utilisateurs ont rencontré un problème lors de la configuration du nom de domaine commercial du programme MINI: � ...

Problèmes et solutions rencontrés lors de la compilation et de l'installation de Redis sur Apple M1 Chip Mac, de nombreux utilisateurs peuvent ...

Comment implémenter la fonction de déclenchement de l'arrière-plan Asynchrone Lot Envoi de SMS au premier plan? Dans certains scénarios d'application, les utilisateurs doivent déclencher un lot court en arrière-plan grâce aux opérations de premier plan ...
