hyperscan: Hyperscan pour nginx-module-lua
Installation
Si vous n'avez pas encore configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.
CentOS/RHEL 7 ou Amazon Linux 2
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-hyperscan
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-hyperscan
Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.
Ce document décrit lua-resty-hyperscan v0.3 publié le 14 avril 2022.
lua-resty-hyperscan - Hyperscan pour Openresty
!!! Ancienne branche a rencontré un problème de trop de callbacks, car luajit ne prend pas complètement en charge CALLBACK. Nous avons donc besoin d'un wrapper C pour gérer les callbacks.
Tout d'abord, vous devez installer openresty
git clone git@github.com:LubinLew/lua-resty-hyperscan.git cd lua-resty-hyperscan make make install make test
##
##
## Synopsis
exemple de configuration
```lua
user nobody;
worker_processes auto;
error_log logs/error.log error;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
access_log logs/access.log;
init_by_lua_block {
local whs, err = require('hyperscan')
if not whs then
ngx.log(ngx.ERR, "Échec :", err)
return
end
-- nouveau
local obj = whs.block_new("a-uniq-name", true) -- true : activer le mode débogage
local patterns = {
{id = 1001, pattern = "\\d3", flag = "iu"},
{id = 1002, pattern = "\\s{3,5}", flag = "u"},
{id = 1003, pattern = "[a-d]{2,7}", flag = ""}
}
-- compiler
ret, err = obj:compile(patterns)
if not ret then
ngx.log(ngx.ERR, "échec de la compilation du bloc hyperscan, ", err)
return
end
}
server {
listen 80;
server_name localhost;
location / {
content_by_lua_block {
local whs = require('hyperscan')
local obj = whs.block_get("a-uniq-name")
-- scanner
local ret, id, from, to = obj:scan(ngx.var.uri)
if ret then
return ngx.print("[", ngx.var.uri,"] correspond : ", id, " zone [", from, " - ", to, ").\n")
else
return ngx.print("[", ngx.var.uri, "] ne correspond à aucune règle.\n")
end
}
}
}
}
cas de test :
$ curl http://localhost
[/] ne correspond à aucune règle.
$ curl http://localhost/131111111
[/131111111] correspond : 1001 zone [0 - 3).
$ curl "http://localhost/ end"
[/ end] correspond : 1002 zone [0 - 4).
$ curl http://localhost/aaaaaaa
[/aaaaaaa] correspond : 1003 zone [0 - 3).
Méthodes
manière de charger cette bibliothèque
local whs,err = require('hyperscan')
if not whs then
ngx.log(ngx.ERR, "raison : ", err)
end
block_new
Créer une instance hyperscan pour le mode bloc.
local handle, err = whs.block_new(name, debug)
if not handle then
ngx.log(ngx.ERR, "raison : ", err)
end
| Champ | Nom | Type Lua | Description |
|---|---|---|---|
| Paramètre | name |
string | nom de l'instance, principalement pour le journal |
debug |
boolean | activer/désactiver l'écriture des journaux de débogage dans syslog | |
| Valeur de retour | handle |
table/nil | référence de l'instance |
err |
string | raison de l'échec |
block_free
Détruire une instance hyperscan pour le mode bloc.
whs.block_free(name)
block_get
Obtenir la référence de l'instance par nom.
local handle = whs.block_get(name)
| Champ | Nom | Type Lua | Description |
|---|---|---|---|
| Paramètre | name |
string | nom de l'instance |
| Valeur de retour | handle |
table/nil | référence de l'instance |
vector_new
Créer une instance hyperscan pour le mode vecteur.
local handle, err = whs.vector_new(name, debug)
if not handle then
ngx.log(ngx.ERR, "raison : ", err)
end
| Champ | Nom | Type Lua | Description |
|---|---|---|---|
| Paramètre | name |
string | nom de l'instance, principalement pour le journal |
debug |
boolean | activer/désactiver l'écriture des journaux de débogage dans syslog | |
| Valeur de retour | handle |
table/nil | référence de l'instance |
err |
string | raison de l'échec |
vector_free
Détruire une instance hyperscan pour le mode vecteur.
whs.vector_free(name)
vector_get
Obtenir la référence de l'instance par nom.
local handle = whs.vector_get(name)
| Champ | Nom | Type Lua | Description |
|---|---|---|---|
| Paramètre | name |
string | nom de l'instance |
| Valeur de retour | handle |
table/nil | référence de l'instance |
handle:compile
compiler une expression régulière dans une base de données Hyperscan.
--local handle = whs.block_new(name, debug)
local ok, err = handle:compile(patterns)
if not ok then
ngx.log(ngx.ERR, "raison : ", err)
end
| Champ | Nom | Type Lua | Description |
|---|---|---|---|
| paramètre | patterns |
table | liste des motifs |
| Valeur de retour | ok |
boolean | succès/échec |
err |
string | raison de l'échec |
Liste des motifs
Exemple
local patterns = {
{id = 1001, pattern = "\\d3", flag = "iu" },
{id = 1002, pattern = "\\s{3,5}", flag = "dmsu" },
{id = 1003, pattern = "[a-d]{2,7}", flag = "" }
}
Drapeaux
| Drapeau | Valeur Hyperscan | Description |
|---|---|---|
'i' |
HS_FLAG_CASELESS | Définir une correspondance insensible à la casse |
'd' |
HS_FLAG_DOTALL | Une correspondance avec un . n'exclura pas les nouvelles lignes. |
'm' |
HS_FLAG_MULTILINE | Définir l'ancrage multi-lignes. |
's' |
HS_FLAG_SINGLEMATCH | Définir le mode de correspondance unique. |
'e' |
HS_FLAG_ALLOWEMPTY | Autoriser les expressions pouvant correspondre à des tampons vides. |
'u' |
HS_FLAG_UTF8 | Activer le mode UTF-8 pour cette expression. |
'p' |
HS_FLAG_UCP | Activer le support des propriétés Unicode pour cette expression. |
'f' |
HS_FLAG_PREFILTER | Activer le mode de préfiltrage pour cette expression. |
'l' |
HS_FLAG_SOM_LEFTMOST | Activer le rapport de début de correspondance le plus à gauche. |
'c' |
HS_FLAG_COMBINATION | Combinaison logique. |
'q' |
HS_FLAG_QUIET | Ne pas faire de rapport de correspondance. |
handle:scan
La correspondance de motifs réelle a lieu pour les bases de données de motifs en mode bloc.
--local handle = whs.block_get(name)
local ok, id, from, to = handle:scan(data)
if ok then
ngx.log(ngx.INFO, "correspondance réussie", id, from, to)
end
La correspondance de motifs réelle a lieu pour les bases de données de motifs en mode vecteur.
--local handle = whs.vector_get(name)
--local data = {"s","s2"}
--local data = "s"
local ok, id, dataindex, to = handle:scan(data)
if ok then
ngx.log(ngx.INFO, "correspondance réussie", id, from, to)
end
| Champ | Nom | Type Lua | Description |
|---|---|---|---|
| Paramètre | data |
string/string[] | chaîne à scanner (string[] uniquement en mode vecteur) |
| Valeur de retour | ok |
boolean | true pour correspondance, false pour non correspondance |
id |
number | identifiant de correspondance | |
from |
number | correspondance à partir de l'index du tableau d'octets (y compris lui-même) | |
to |
number | fin de la correspondance à l'index du tableau d'octets (exclut lui-même) | |
dataindex |
number | index de données correspondant (uniquement en mode vecteur) |
handle:free
Détruire une instance hyperscan.
--local handle = whs.block_get(name)
handle:free()
GitHub
Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-hyperscan.