hyperscan: Hyperscan für nginx-module-lua
Installation
Wenn Sie noch kein RPM-Repository-Abonnement eingerichtet haben, melden Sie sich an. Dann können Sie mit den folgenden Schritten fortfahren.
CentOS/RHEL 7 oder 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
Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.
Dieses Dokument beschreibt lua-resty-hyperscan v0.3, das am 14. April 2022 veröffentlicht wurde.
lua-resty-hyperscan - Hyperscan für Openresty
!!! Alter Branch hatte ein zu viele Rückrufe Problem, da luajit nicht vollständig CALLBACK unterstützt. Daher benötigen wir einen C-Wrapper, um Rückrufe zu behandeln.
Zuerst sollten Sie OpenResty installieren
git clone git@github.com:LubinLew/lua-resty-hyperscan.git cd lua-resty-hyperscan make make install make test
##
##
## Zusammenfassung
Konfigurationsbeispiel
```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, "Fehler:", err)
return
end
-- neu
local obj = whs.block_new("a-uniq-name", true) -- true : Debug-Modus aktivieren
local patterns = {
{id = 1001, pattern = "\\d3", flag = "iu"},
{id = 1002, pattern = "\\s{3,5}", flag = "u"},
{id = 1003, pattern = "[a-d]{2,7}", flag = ""}
}
-- kompilieren
ret, err = obj:compile(patterns)
if not ret then
ngx.log(ngx.ERR, "Hyperscan-Blockkompilierung fehlgeschlagen, ", 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")
-- scannen
local ret, id, from, to = obj:scan(ngx.var.uri)
if ret then
return ngx.print("[", ngx.var.uri,"] Übereinstimmung: ", id, " Bereich [", from, " - ", to, ").\n")
else
return ngx.print("[", ngx.var.uri, "] keine Regel übereinstimmt.\n")
end
}
}
}
}
Testfälle:
$ curl http://localhost
[/] keine Regel übereinstimmt.
$ curl http://localhost/131111111
[/131111111] Übereinstimmung: 1001 Bereich [0 - 3).
$ curl "http://localhost/ end"
[/ end] Übereinstimmung: 1002 Bereich [0 - 4).
$ curl http://localhost/aaaaaaa
[/aaaaaaa] Übereinstimmung: 1003 Bereich [0 - 3).
Methoden
Möglichkeit, diese Bibliothek zu laden
local whs,err = require('hyperscan')
if not whs then
ngx.log(ngx.ERR, "Grund: ", err)
end
block_new
Erstellen Sie eine Hyperscan-Instanz für den Blockmodus.
local handle, err = whs.block_new(name, debug)
if not handle then
ngx.log(ngx.ERR, "Grund: ", err)
end
| Feld | Name | Lua-Typ | Beschreibung |
|---|---|---|---|
| Parameter | name |
string | Instanzname, hauptsächlich für Protokoll |
debug |
boolean | Aktivieren/Deaktivieren des Schreibens von Debug-Protokollen in Syslog | |
| Rückgabewert | handle |
table/nil | Instanzreferenz |
err |
string | Grund für das Scheitern |
block_free
Zerstören Sie eine Hyperscan-Instanz für den Blockmodus.
whs.block_free(name)
block_get
Holen Sie sich die Instanzreferenz nach Name.
local handle = whs.block_get(name)
| Feld | Name | Lua-Typ | Beschreibung |
|---|---|---|---|
| Parameter | name |
string | Instanzname |
| Rückgabewert | handle |
table/nil | Instanzreferenz |
vector_new
Erstellen Sie eine Hyperscan-Instanz für den Vektormodus.
local handle, err = whs.vector_new(name, debug)
if not handle then
ngx.log(ngx.ERR, "Grund: ", err)
end
| Feld | Name | Lua-Typ | Beschreibung |
|---|---|---|---|
| Parameter | name |
string | Instanzname, hauptsächlich für Protokoll |
debug |
boolean | Aktivieren/Deaktivieren des Schreibens von Debug-Protokollen in Syslog | |
| Rückgabewert | handle |
table/nil | Instanzreferenz |
err |
string | Grund für das Scheitern |
vector_free
Zerstören Sie eine Hyperscan-Instanz für den Vektormodus.
whs.vector_free(name)
vector_get
Holen Sie sich die Instanzreferenz nach Name.
local handle = whs.vector_get(name)
| Feld | Name | Lua-Typ | Beschreibung |
|---|---|---|---|
| Parameter | name |
string | Instanzname |
| Rückgabewert | handle |
table/nil | Instanzreferenz |
handle:compile
Kompilieren Sie reguläre Ausdrücke in eine Hyperscan-Datenbank.
--local handle = whs.block_new(name, debug)
local ok, err = handle:compile(patterns)
if not ok then
ngx.log(ngx.ERR, "Grund: ", err)
end
| Feld | Name | Lua-Typ | Beschreibung |
|---|---|---|---|
| Parameter | patterns |
table | Musterliste |
| Rückgabewert | ok |
boolean | Erfolg/Misserfolg |
err |
string | Grund für das Scheitern |
Musterliste
Beispiel
local patterns = {
{id = 1001, pattern = "\\d3", flag = "iu" },
{id = 1002, pattern = "\\s{3,5}", flag = "dmsu" },
{id = 1003, pattern = "[a-d]{2,7}", flag = "" }
}
Flags
| Flag | Hyperscan-Wert | Beschreibung |
|---|---|---|
'i' |
HS_FLAG_CASELESS | Setzt die Groß-/Kleinschreibung ignorierende Übereinstimmung |
'd' |
HS_FLAG_DOTALL | Bei der Übereinstimmung mit . werden keine Zeilenumbrüche ausgeschlossen. |
'm' |
HS_FLAG_MULTILINE | Setzt mehrzeilige Verankerung. |
's' |
HS_FLAG_SINGLEMATCH | Setzt den Modus nur für Einzelübereinstimmungen. |
'e' |
HS_FLAG_ALLOWEMPTY | Erlaubt Ausdrücke, die gegen leere Puffer übereinstimmen können. |
'u' |
HS_FLAG_UTF8 | Aktiviert den UTF-8-Modus für diesen Ausdruck. |
'p' |
HS_FLAG_UCP | Aktiviert die Unterstützung für Unicode-Eigenschaften für diesen Ausdruck. |
'f' |
HS_FLAG_PREFILTER | Aktiviert den Vorfiltermodus für diesen Ausdruck. |
'l' |
HS_FLAG_SOM_LEFTMOST | Aktiviert die Meldung des linksseitigsten Beginns der Übereinstimmung. |
'c' |
HS_FLAG_COMBINATION | Logische Kombination. |
'q' |
HS_FLAG_QUIET | Keine Übereinstimmungsberichterstattung durchführen. |
handle:scan
Die tatsächliche Musterübereinstimmung erfolgt für Blockmodus-Muster-Datenbanken.
--local handle = whs.block_get(name)
local ok, id, from, to = handle:scan(data)
if ok then
ngx.log(ngx.INFO, "Übereinstimmung erfolgreich", id, from, to)
end
Die tatsächliche Musterübereinstimmung erfolgt für Vektormodus-Muster-Datenbanken.
--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, "Übereinstimmung erfolgreich", id, from, to)
end
| Feld | Name | Lua-Typ | Beschreibung |
|---|---|---|---|
| Parameter | data |
string/string[] | Zeichenfolge, die gescannt werden soll (nur string[] im Vektormodus) |
| Rückgabewert | ok |
boolean | true für Übereinstimmung, false für keine Übereinstimmung |
id |
number | Übereinstimmungs-ID | |
from |
number | Übereinstimmungsbeginn-Byte-Array-Index (einschließlich selbst) | |
to |
number | Übereinstimmungsende-Byte-Array-Index (ausschließlich selbst) | |
dataindex |
number | Übereinstimmungsdatenindex (nur Vektormodus) |
handle:free
Zerstören Sie eine Hyperscan-Instanz.
--local handle = whs.block_get(name)
handle:free()
GitHub
Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-hyperscan.